810639 | asia2562219 | A | Accepted | 232 KB | 343 ms | C++ | 1243 B | 2012-11-11 20:36:43 |
这里两个点事分属两个集合,sex[i]保存与i性别不同的节点。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <iostream> using namespace std; #define MAXN 1111111 int father[MAXN],n,m,sex[MAXN]; bool flag=true; int find(int x) { int i,j,r=x; while(father[r]!=r) r=father[r]; i=x; while(i!=r) { j=father[i]; father[i]=r; i=j; } return r; } void Union(int x,int y) { x=find(x); y=find(y); if(x!=y) father[x]=y; } int main() { int t,cases=1,i,j,x,y; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); flag=true; for(i=0;i<=n;i++) { father[i]=i; sex[i]=0; } for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); if(find(x)==find(y)) flag=false; else { if(sex[x]==0) sex[x]=y; else Union(sex[x],y); if(sex[y]==0) sex[y]=x; else Union(sex[y],x); } } printf("Scenario #%d:\n",cases++); if(!flag) printf("Suspicious bugs found!\n"); else printf("No suspicious bugs found!\n"); printf("\n"); } return 0; }
11.11 依旧光棍……