POJ 1611 The Suspects 并查集问题
2015-04-21 23:41
441 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66964#problem/B
题意:SARS问题,把与0号属于同一个集合的 Suspect 计算出来。
题意很简单,不过又犯了老错误,把两个点是否属于同一个集合,用pre[i]==pre[j]来判断了,导致WA,看来得牢记:并查集的两个点是否属于同一个集合用的是find,不是pre!!!还有一点,这里增加了一个vis数组,用来标志改点是否在之前已经属于其他集合,如果是的话,则把其他的加入该集合,否则,把该点加入其他集合。
代码:
题意:SARS问题,把与0号属于同一个集合的 Suspect 计算出来。
题意很简单,不过又犯了老错误,把两个点是否属于同一个集合,用pre[i]==pre[j]来判断了,导致WA,看来得牢记:并查集的两个点是否属于同一个集合用的是find,不是pre!!!还有一点,这里增加了一个vis数组,用来标志改点是否在之前已经属于其他集合,如果是的话,则把其他的加入该集合,否则,把该点加入其他集合。
代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m; int pre[30010],vis[30010]; int find(int x){ int t=x; while(pre[t]!=t) t=pre[t]; while(x!=t) pre[x]=t,x=pre[x]; return t; } int main(){ //freopen("D:\\in.txt","r",stdin); while(cin>>n){ cin>>m; if(!n && !m) break; for(int i=0;i<=n;i++) pre[i]=i; memset(vis,0,sizeof(vis));//点是否已经在之前已经出现过 for(int i=0;i<m;i++){ int k,t,s;scanf("%d",&k); for(int j=0;j<k;j++){ scanf("%d",&t); if(j==0) {s=t;vis[s]=1;continue;} if(vis[t]) pre[find(s)]=find(t); else pre[find(t)]=find(s); s=t; vis[s]=1; } } int cnt=1; for(int i=1;i<n;i++) if(find(i)==find(0)) cnt++;//不是pre数组!! cout<<cnt<<endl; } return 0; }
相关文章推荐
- POJ 1611 The Suspects 并查集 Union Find
- POJ 1611 The Suspects G++ 并查集例题
- 【解题报告】 POJ 1611 The Suspects 并查集基础 (一点自己的感悟)
- poj 1611 The Suspects 并查集
- 【POJ 1611 The Suspects】+ 并查集
- POJ 1611 The Suspects 并查集
- POJ 1611 :The Suspects(并查集)
- POJ 1611 The Suspects 并查集简单题
- 并查集-poj-1611-The Suspectst
- Poj1611 The Suspects 并查集基础题
- 平常水题 - The Suspects POJ-1611(并查集)
- poj1611 The Suspects 并查集_小优化
- POJ 1611 The Suspects - 并查集
- poj 1611 The Suspects -- 并查集
- 【并查集】POJ 1611 The Suspects
- POJ1-1611-The Suspects【并查集】
- POJ 1611 The Suspects 并查集
- poj-1611-The Suspects【并查集】
- POJ 1611 The Suspects【并查集入门】
- G - The Suspects POJ - 1611(并查集)