zoj2833

来源:互联网 发布:淘宝开通购物号 编辑:程序博客网 时间:2024/06/06 10:00
这个并查集的题目写的倒是挺快的
然而说我超时。。
#include<iostream>#include<string.h>using namespace std;int main(){int N[100001],X[100001], i = 0, n = 0, m = 0, a = 0, b = 0, a2 = 0, b2 = 0, t = 0,x=1,y=0;char ch;while ((cin >> n >> m)){memset(N, -1, sizeof(int)*(n+1));for (i = 0; i < m; i++){cin >> ch;switch(ch){case 'M':cin >> a >> b;a2 = t = a;while (N[t] >= 0){t = N[a];a = t;}b2 = t = b;while (N[t] >= 0){t = N[b];b = t;}if (a != b){N[a] = N[a] + N[b];N[b] = a;if (a != a2){N[a2] = a;}    N[b2] = a;}break;case 'Q':cin >> a;t = a;while (N[t] >= 0){t = N[a];a = t;}y++;X[y] = -1*N[a];//cout << -N[a] << endl;break;default:break;}}cout << endl;cout << "Case" << x << ":" << endl;for (i = 1; i <= y; i++){cout << X[i] << endl;}x++; y = 0;}return 0;}

改了改还是说我超时///                                                     

#include<iostream>#include<string.h>using namespace std;int N[100001], X[100001];int main(){int  i = 0, n = 0, m = 0, a = 0, b = 0,x=1,y=0;char ch;int find(int x);while ((cin >> n >> m)){memset(N, -1, sizeof(int)*(n+1));for (i = 0; i < m; i++){cin >> ch;switch(ch){case 'M':cin >> a >> b;a = find(a);b = find(b);if (a != b){N[a] = N[a] + N[b];N[b] = a;}break;case 'Q':cin >> a;a = find(a);y++;X[y] = -1*N[a];break;default:break;}}cout << endl;cout << "Case" << x << ":" << endl;for (i = 1; i <= y; i++){cout << X[i] << endl;}x++; y = 0;}return 0;}int find(int x){int t = 0;while (N[x] >= 0){t = N[x];x = t;}return x;}

尝试无果,还是不知道为何超时。。
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;int N[100001], X[100001];int main(){int  i = 0, n = 0, m = 0, a = 0, b = 0,x=1,l=0;char ch;int find(int x);void add(int a, int b);while (scanf("%d%d", &n, &m) ){memset(N, -1, sizeof(int)*(n+1));if(l)printf("\n");l = 1;printf("Case %d:\n", x++);for (i = 0; i < m; i++){scanf("%c", &ch);cin >> ch;switch(ch){case 'M':add(a, b);break;case 'Q':scanf("%d", &a);a = find(a);//y++;//X[y] = -1*N[a];printf("%d\n", -1 * N[a]);//cout << -1 * N[a] << endl;break;default:break;}}/*for (i = 1; i <= y; i++){cout << X[i] << endl;}*///x++; //y = 0;}return 0;}int find(int x){int t = 0;while (N[x] >= 0){t = N[x];x = t;}return x;}void add(int a, int b){//cin >> a >> b;scanf("%d%d", &a, &b);a = find(a);b = find(b);if (a != b){N[a] = N[a] + N[b];N[b] = a;}return ;}


{更新!!}
终于AC了
照着网上的代码把输入输出改成了scanf和printf
学到了一点就是scanf的" "输入之间一定要有空格,否则就会把分隔符号(空格)当成是输入的内容,自然会报错
接着把并查集的孩子都直接指向母亲
以及一直说我Time Limit Exceeded 的原因就是输入的部分,没有设置跳出循环的条件
以为cin>>如果没有输入就会直接结束
发现并不是这样
以及每个结果之间要加空行的IF语句方法!
以及直接cout<<x++的方法!
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;int N[100001], X[100001];int main(){int  i = 0, n = 0, m = 0, a = 0, b = 0,x=1,l=0;char ch;int find(int x);void add(int a, int b);while (scanf("%d %d", &n, &m )!=EOF ){memset(N, -1, sizeof(int)*(n+1));if(l)printf("\n");l = 1;printf("Case %d:\n", x++);for (i = 0; i < m; i++){scanf(" %c", &ch);//cin >> ch;switch(ch){case 'M':add(a, b);break;case 'Q':scanf(" %d", &a);a = find(a);//y++;//X[y] = -1*N[a];printf("%d\n", -1 * N[a]);//cout << -1 * N[a] << endl;break;default:break;}}/*for (i = 1; i <= y; i++){cout << X[i] << endl;}*///x++; //y = 0;}return 0;}int find(int x){int t = 0;while (N[x] >= 0){t = N[x];x = t;}return x;}void add(int a, int b){//cin >> a >> b;scanf("%d %d", &a, &b);int a1 = 0, b1 = 0;a1 = find(a);b1 = find(b);if (a1 != b1){N[a1] = N[a1] + N[b1];N[b1] = a1;}if (a1 != a)N[a] = a1;if (b1 != b)N[b] = a1;return ;}

还是把代码精简一下
#include<stdio.h>#include<string.h>using namespace std;int N[100001], X[100001];int main(){int  i = 0, n = 0, m = 0, a = 0, b = 0, x = 1, l = 0;char ch;int find(int x);void add(int a, int b);while (scanf("%d %d", &n, &m) != EOF){memset(N, -1, sizeof(int)*(n + 1));if (l)printf("\n");l = 1;printf("Case %d:\n", x++);for (i = 0; i < m; i++){scanf(" %c", &ch);switch (ch){case 'M':add(a, b);break;case 'Q':scanf(" %d", &a);a = find(a);printf("%d\n", -1 * N[a]);break;default:break;}}}return 0;}int find(int x){int t = 0;while (N[x] >= 0){t = N[x];x = t;}return x;}void add(int a, int b){scanf("%d %d", &a, &b);int a1 = 0, b1 = 0;a1 = find(a);b1 = find(b);if (a1 != b1){N[a1] = N[a1] + N[b1];N[b1] = a1;}if (a1 != a)N[a] = a1;if (b1 != b)N[b] = a1;return;}


刚刚还是不死心的用cin和cout试了一次
发现没能找到比较好结束while循环的方式
应该是因为结束不了才不能用cin来写吧。。
0 0
原创粉丝点击