您的位置:首页 > 其它

POJ1308 Is It A Tree?

2012-07-07 09:53 267 查看
1. 并查集,有点忘了,看维基百科回顾起来了,三个操作,路径压缩、合并、查找父节点。代码很简单,具体参考http://zh.wikipedia.org/wiki/%E5%B9%B6%E6%9F%A5%E9%9B%862. WA了好多次,最后发现是当空树的时候也是一棵树,fuck。。。
#include <iostream>#include <fstream>#include <string>#include <algorithm>#include <cstring>#include <stack>#include <queue>#define maxn 1000using namespace std;int p[maxn], flag[maxn];int getfather(int x){return p[x] == x ? x : p[x] = getfather(p[x]);}int main(){int t = 1, a, b;while (cin >> a >> b && a != -1){if (!a){cout << "Case " << t++ << " is a tree." << endl;continue;}int is = 1, tail = 0;for (int i = 1; i < maxn; ++i){p[i] = i;flag[i] = 0;}while (a){if (is){int ra = getfather(a), rb = getfather(b);if (ra == rb){is = 0;}else{p[rb] = ra;flag[a] = flag[b] = 1;tail = max(tail, max(a, b));}}cin >> a >> b;}if (!is){cout << "Case " << t++ << " is not a tree." << endl;}else{int roots = 0;for (int i = 1; i <= tail; i++){if (flag[i] && p[i] == i){roots++;if (roots > 1)break;}}if (roots == 1)cout << "Case " << t++ << " is a tree." << endl;elsecout << "Case " << t++ << " is not a tree." << endl;}}return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: