hdu 1232 畅通工程(并查集)
题意:
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
思路:
简单并查集
代码:
int n,m; int fa[1005]; int findFa(int x){ return fa[x]==x?fa[x]:fa[x]=findFa(fa[x]); } int main(){ while(scanf("%d",&n),n){ scanf("%d",&m); rep(i,1,n) fa[i]=i; while(m--){ int a,b; scanf("%d%d",&a,&b); if(findFa(a)!=findFa(b)){ fa[fa[a]]=b; } } rep(i,1,n) findFa(i); sort(fa+1,fa+1+n); int ans=0; fa[0]=-1; rep(i,1,n) if(fa[i]!=fa[i-1]) ++ans; printf("%d\n",ans-1); } return 0; }