HDU1232 畅通工程
题目描述:某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
#include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <queue> #include <vector> #include <cstdio> int pre[1000];//祖先数组 bool f[1000];//标记根节点 int find(int x)//查找根节点 { int r=x; while(pre[r]!=r)//返回根节点r r=pre[r]; int i=x,j; while(i!=r)//路径压缩 { j=pre[i];//在改变上级之前用临时变量j记录下他的值 pre[i]=r;//把上级改为根节点 i=j; } return r; } void join(int x,int y)//判断x,y是否连通.如果已经连通,就不用管了;如果不连通,就把它们所在的连通分支合并起 { int fx=find(x),fy=find(y); if(fx!=fy) pre[fy]=fx; } int main() { freopen("in.txt","r",stdin); int n,m,ans; while(~scanf("%d",&n)&&n) { scanf("%d",&m); memset(f,false,sizeof(f)); int x,y; ans=0; for(int i=1; i<=n; i++) pre[i]=i; while(m--) { scanf("%d%d",&x,&y); join(x,y); } for(int i=1; i<=n; i++) f[find(i)]=true; for(int i=1; i<=n; i++) if(f[i]==true) ans++; printf("%d\n",ans-1); } return 0; }