标签:style blog class c code tar
题目:
链接:点击打开链接
题意:
思路:
一个并查集,题目就是要让你判断是否是一个连通的无环图。1>判断成环的时候,只要判断输入边的两个点。有一个共同的父节点,那么这两个点就成环。2>判断连通的时候,只要判断根节点数为1即可。注意:当输入的这组数据只有 0 0 时,依然是满足,即应输出 "Yes"。
代码:
#include<iostream> #include<cstdio> #include<cstring> #define MAXN 100010 using namespace std; int a,b; int flag; int root[MAXN],sign[MAXN]; int find(int x) { int r = x; while(r != root[r]) r = root[r]; return r; } void merge(int x,int y) { int fx = find(x); int fy = find(y); if(fx != fy) root[fx] = fy; else//有共同的父节点 flag = 0; } int main() { //freopen("input.txt","r",stdin); int ok; while(scanf("%d%d",&a,&b) != EOF && (a != -1 || b != -1)) { memset(root,0,sizeof(root)); if(a == 0 && b == 0) { printf("Yes\n"); continue; } for(int i=1; i<MAXN; i++) { root[i] = i; sign[i] = 0; } sign[a] = 1; sign[b] = 1;//输入的边的两个点 flag = 1; merge(a,b); while(scanf("%d%d",&a,&b) && (a || b)) { merge(a,b); sign[a] = 1; sign[b] = 1; } ok = 0; for(int i=1; i<MAXN; i++) { if(sign[i] && root[i] == i) ++ok;//根结点数目 if(ok>1) flag = 0; } if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }
标签:style blog class c code tar
原文地址:http://blog.csdn.net/u013147615/article/details/26360377