http://acm.hdu.edu.cn/showproblem.php?pid=1232
第一次做并查集,有点小爽。。。
View Code
#include <stdio.h> #include <string.h> #include <stdlib.h> int idx[2000]; int n,m; int find(int x) { //找x所在并查集的根节点 return idx[x]==x?x:idx[x]=find(idx[x]); } int add(int a,int b) { //把b连到a上 return idx[b]=a; } int main() { int a,b,i; int p,q; int ans; while(scanf("%d",&n),n) { scanf("%d",&m); ans=n-1; for(i=1;i<=n;i++) idx[i]=i; for(i=0;i<m;i++) { scanf("%d%d",&a,&b); p=find(a); q=find(b); if(p!=q) { add(p,q); ans--; } } printf("%d\n",ans); } return 0; }