Problem Description
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
Input测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。 注意:两个城市之间可以有多条道路相通,也就是说
3 3 1 2 1 2 2 1
这种输入也是合法的 当N为0时,输入结束,该用例不被处理。Output对每个测试用例,在1行里输出最少还需要建设的道路数目。4 21 34 33 31 21 32 35 21 23 5999 00Sample Output102998Huge input, scanf is recommended.HintHint
#include <stdio.h>//并查集,找分支数 int Father[50000]; int city,road; int Find(int x)//找一棵子树的根结点 { if ( x == Father[x] ) return Father[x]; return Father[x] = Find(Father[x]); } void Make()//初始化结点 { for(int i=1; i<=city; ++i) Father[i] = i; } void Union(int x,int y)//联合两棵子树 { int fx = Find(x); int fy = Find(y); if( fx != fy ) Father[fx] = fy; } int main() { int x,y,i,ans; while( scanf("%d",&city)!=EOF && city != 0 ) { scanf("%d",&road); Make(); while( road -- ) { scanf("%d%d",&x,&y); Union(x,y); } ans = 0; for(i = 1; i<=city; ++i) { if( Father[i] == i ) ++ans; } printf("%d\n", ans-1); } return 0; }
Click me~
Problem Description某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。Input测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 当N为0时,输入结束,该用例不被处理。Output对每个测试用例,在1行里输出最小的公路总长度。Sample Input3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0Sample Output3 5Huge input, scanf is recommended.HintHint
#include<iostream> #include<algorithm> using namespace std; struct Edge { int x; int y; int length; }; Edge Edg[50005]; int Father[50005]; int EdgeLen; int MinRoad; bool comp(const Edge& x,const Edge& y) { return x.length < y.length; } /* int Find(int x) { if(x == Father[x]) return Father[x]; return Father[x] = Find(Father[x]); }*/ int Find(int x) { while(x != Father[x]) x = Father[x]; return x; } void Initialize() { for(int i=0; i<=EdgeLen; ++i) Father[i] = i; } void Union(int x,int y,int z) { int fx = Find(x); int fy = Find(y); if( fx != fy ) { Father[fx] = fy; MinRoad += z; } } void Kruskal() { sort(Edg+1,Edg+EdgeLen+1,comp); //在这里贡献了一次Runtime Error int i; for(i=1; i<=EdgeLen; ++i) { Union(Edg[i].x,Edg[i].y,Edg[i].length); } //cout << MinRoad << endl; printf("%d\n",MinRoad); } int main() { int N,i; while(scanf("%d",&N)!=EOF && N !=0) { MinRoad = 0; EdgeLen = ((N*(N-1))>>1); for(i=1; i<=EdgeLen; ++i) scanf("%d%d%d",&Edg[i].x,&Edg[i].y,&Edg[i].length); Initialize(); Kruskal(); } return 0; }