标签:
Input
Output
Sample Input
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0 0 0
Sample Output
4 1 1
这是一道典型的并查集题目。代码好懂,直接上吧。。。
由于自己基础不是很好,所以难免有参考不当的地方,望提醒,望见谅。。。
代码:
#include <cstdio> int father[30005]; int find (int x) { int z,y=x; while (y!=father[y]) y=father[y]; while (x!=father[x]) { z=father[x]; father[x]=y; x=z; } return y; } void Union(int x,int y) { int rx=find(x); int ry=find(y); if (rx!=ry) { father[rx]=ry; } } int main () { int n,m,i,k,j; int stu[30005]; while (~scanf ("%d%d",&n,&m) && n+m) { for (i=0;i<n;i++) { father[i]=i; } for (j=0;j<m;j++) { scanf ("%d",&k); for (i=0;i<k;i++) { scanf ("%d",&stu[i]); if (i!=0) Union(stu[i-1],stu[i]); } } int sum=0; for (i=0;i<n;i++) if (find(0)==find(i)) sum++; printf ("%d\n",sum); } return 0; }
注解:其中find函数及union函数个人理解为特定式,根据题目要求的不同应该稍作修改。
标签:
原文地址:http://www.cnblogs.com/kewer/p/4712684.html