标签:
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 37444 Accepted Submission(s): 19834
4 2 1 3 4 3 3 3 1 2 1 3 2 3 5 2 1 2 3 5 999 0 0
1 0 2 998Huge input, scanf is recommended.HintHint
#include <stdio.h> int per[1005];//代表一个数的父节点 int n,m;//n,m分别代表城市的个数和路的个数 void init()//输入函数,建立n个城市,城市之间没有路 { for(int i=1;i<=n;i++) per[i]=i; } int find(int x)//查找函数,查找x的根,并且将与x相连的所有的点都与根相连(压缩路径) { int r; r=x; while(r!=per[r]) r=per[r]; int i,j; i=x; while(i!=r) { j=per[i]; per[i]=r; i=j; } return r; } void join(int x,int y)//如果x,y的根不相等,则将x的根连接到y的根上面 { int fx,fy; fx=find(x); fy=find(y); if(fx!=fy) per[fx]=fy; } int main() { int a,b,s;//a,b代表的是有关联的城市;s代表的是有多少个根 while(scanf("%d",&n)&&n)//n代表的是城市的个数 { scanf("%d",&m);//m代表的是路的个数 init();//将n个城市建立成n个独立的集合 for(int i=0;i<m;i++)//将有关联的集合组合到一起,也就是具有相同的根 { scanf("%d%d",&a,&b); join(a,b); } s=0; for(int i=1;i<=n;i++)//查找根的个数 { if(per[i]==i) s++; } printf("%d\n",s-1);//需要修的最少的路的个数就是根的个数减一 } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/dxx_111/article/details/47125029