这道题跟HDU 1213 How Many Tables 并查集非常接近,都是赤裸裸的并查集的题。
思路:假设还需要建n-1条路,每并一次就自减1。
参考代码:
#include<stdio.h> int fa[1000]; int find(int u) { return fa[u]==u?u:fa[u]=find(fa[u]); } int main() { int i,n,m,u,v,x,y; scanf("%d%d",&n,&m); while (n) { for (i=1;i<=n;i++) fa[i]=i; for (i=1;i<=m;i++) { scanf("%d%d",&u,&v); x=find(u);y=find(v); if (x!=y) { fa[x]=y; n--; } } n--; printf("%d\n",n); scanf("%d%d",&n,&m); } return 0; }
赋初值fa[u[i]]=u[i];fa[v[i]]=v[i];
参考代码:
#include<stdio.h> int fa[1000],u[1000],v[1000]; int find(int u) { return fa[u]==u?u:fa[u]=find(fa[u]); } int main() { int i,n,m,x,y; scanf("%d%d",&n,&m); while (n) { for (i=1;i<=m;i++) { scanf("%d%d",&u[i],&v[i]); fa[u[i]]=u[i]; fa[v[i]]=v[i]; } for (i=1;i<=m;i++) { x=find(u[i]);y=find(v[i]); if (x!=y) { fa[x]=y; n--; } } n--; printf("%d\n",n); scanf("%d%d",&n,&m); } return 0; }
HDU1232 畅通工程 并查集,布布扣,bubuko.com
原文地址:http://blog.csdn.net/yzj577/article/details/38303953