标签:小希的迷宫 ios eset cout cpp asi return The print
http://acm.hdu.edu.cn/showproblem.php?pid=1272 题目链接
思路:
1.每输入一组数据,如果两个点的祖先都是相同的,那么说明他们已经是一个集合的了,如果再连接a,b两个点,就会构成回路,这里也就是要输出no.
2.并查集判断是否存在回路已经通过上述过程判断完成了,但是我们要保证只有一个集合,题目中没有保证,所以我们这里首先要对出现过的点进行标记,然后从1到100005这些个点都进行判断,如果标记过(表示这个点出现过)并且f[i]==i的话,那么就说明i现在是个祖宗,表示有一个集合了,这里如果集合大于1,那就说明要输出NO了。
#include<iostream> #include<map> #include<string.h> using namespace std; // typedef struct node // { // int nVal; // }FindSet; int judge=0; int Visit[100005]; map<int,int>SetToFather; map<int,int>SetSize; void makeSet() { SetToFather.clear(); SetSize.clear(); //coding for(int i=0;i<100005;i++) { SetSize[i]=1; SetToFather[i]=i; } } int FindHead(int nVal) { int father=SetToFather[nVal]; if(nVal!=father) { father=FindHead(father); } SetToFather[nVal]=father; return father; } int UnionSet(int naVal,int nbVal) { int afather=FindHead(naVal); int bfather=FindHead(nbVal); Visit[naVal]=1; Visit[nbVal]=1; if(afather==bfather) { judge=1; } else { int asize=SetSize[afather]; int bsize=SetSize[bfather]; if(asize>bsize) { SetToFather[bfather]=afather; SetSize[afather]=asize+bsize; } else { SetToFather[afather]=bfather; SetSize[bfather]=asize+bsize; } } } int main() { ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int v1,v2; while(cin>>v1>>v2) { if(v1==-1 && v2==-1) break; judge=0; SetToFather.clear(); SetSize.clear(); makeSet(); memset(Visit,0,sizeof(Visit)); if(v1==0 && v2 ==0) { printf("Yes\n"); continue; } UnionSet(v1,v2); while(cin>>v1>>v2) { if(v1==0 && v2==0) break; UnionSet(v1,v2); } if(judge) { printf("No\n"); } else { int ncount=0; for (int i = 0; i < 100005; ++i) { if(Visit[i]&&FindHead(i)==i) { //printf("%d\n", i); ncount++; } } //printf("%d\n", ncount); if(ncount==1) { printf("Yes\n"); } else { printf("No\n"); } } } return 0; }
标签:小希的迷宫 ios eset cout cpp asi return The print
原文地址:https://www.cnblogs.com/RainzzZ/p/12839934.html