HDU 1272 小希的迷宫
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1272
并查集,一开始没看出来.想到后原以为用并查集挺简单的.
没想到各种坑啊.
1.单个测试数据0 0,也就是空图,输出Yes.(什么设定啊?没房间了都.)
2.图中可能有不只一个的集合.(赤裸裸的陷阱啊,我就这样卡了好久啊妈蛋)
最后贴代码吧..又写得好丑
#include <iostream> using namespace std; int p[101000],used[101000]; int find(int x) { while(x != p[x]) x = p[x]; return x; } int flag,edge,vertex; void init() { flag = 1; for(int i=0;i<101000;i++) { p[i] = i; } memset(used,0,sizeof(used)); } void merge(int s,int e) { if(!flag) return; int x = find(s); int y = find(e); if(x!=y) p[x] = y; else flag = 0; } int main() { int s,e; // freopen("input.txt","r",stdin); while(cin>>s>>e&&(s+e)!=-2) { init(); p[s] = e; used[s] = 1; //标记结点已用,下同 used[e] = 1; edge = 1; //初始时为一边 vertex = 2; //初始时为二点 if(s == 0 && e == 0) { cout<<"Yes"<<endl; continue; } if(s == e ) flag = 0;//自环 while(cin>>s>>e&&(s+e)) { if(s == e) flag = 0;//自环 merge(s,e); //合并两点.边加1 edge++; if(!used[s]) vertex++; //若该点未用,则为新点,结点加1,下同 if(!used[e]) vertex++; used[s] = 1; used[e] = 1; } if(flag && vertex == edge+1 ) cout<<"Yes"<<endl;//若最终结点数与边数相差1,则为符合条件的无回路的连通图.图中可能有双集合.故须做此验证 else cout<<"No"<<endl; } return 0; }