并查集思想,初始化每个元素的根节点为本身。
求解目标是求解存在几个集合。解决方案:查看有多少个根节点,表现在记忆数组上就是有多少个元素的根是它本身。
#include<stdio.h> #define M 50005 int ji[M]; int findme(int a) { while(ji[a]!=a) { a=ji[a]; } return a; } void link(int a,int b) { int tmp; tmp=b; a=findme(a); b=findme(b); ji[b]=a; while(ji[tmp]!=tmp) { tmp=ji[tmp]; ji[tmp]=a; } } int main() { int m,a,b,n,i,rel,ca; ca=0; scanf("%d%d",&n,&m); while(n!=0) { ca++; for(i=1;i<=n;i++) { ji[i]=i; } rel=0; while(m--) { scanf("%d%d",&a,&b); link(a,b); } for(i=1;i<=n;i++) { rel+=(ji[i]==i); } printf("Case %d: %d\n",ca,rel); scanf("%d%d",&n,&m); } return 0; }