[关闭]
@laofang 2016-06-30T04:42:38.000000Z 字数 971 阅读 980

最小生成树 Kruskal

java c++


Description
为完成国家规定的“村村通”项目基本要求,某省加快了农村基层道路建设的脚步,该项目要求对于各个村庄都可以实现公路交通到达任意的另一个村庄(但不一定有直接的公路相连,只要能间接通过公路可达即可),为了节省经费,省内要求铺设方案使得公路总长度为最小。请你计算该最小的公路总长度。

Input
测试输入包含多组样例。每组的第1行给出村庄数目n(n<100),随后的n(n-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到n编号。

当n为0时,输入结束,该样例不被处理。

Output
每组数据输出一行,为最小的公路总长度。

Sample Input
3
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
0
Sample Output
3
5

C++ 实现

  1. #include<iostream>
  2. #include<math.h>
  3. #include<vector>
  4. #include<memory.h>
  5. #include<algorithm>
  6. using namespace std;
  7. int par[100];
  8. bool vis[100];
  9. struct edge{
  10. int s;
  11. int t;
  12. int w;
  13. };
  14. bool compare(edge a, edge b){
  15. return a.w < b.w;
  16. }
  17. int findpar(int i){
  18. return par[i]==i?i:findpar(par[i]);
  19. }
  20. int main(){
  21. int n;
  22. while(cin >> n){
  23. if(n==0) break;
  24. int sum = (n*(n-1))/2;
  25. edge es[sum];
  26. memset(par,0,sizeof(par));
  27. memset(vis,0,sizeof(vis));
  28. for(int i=0; i<sum; i++){
  29. cin >> es[i].s >> es[i].t >> es[i].w;
  30. }
  31. for(int i=0;i<n;i++){
  32. par[i] = i;
  33. }
  34. sort(es,es+sum,compare);
  35. int count = 0;
  36. for(edge &e : es){
  37. if(findpar(e.s) != findpar(e.t)){
  38. par[findpar(e.t)] = e.s;
  39. count += e.w;
  40. }
  41. }
  42. cout << count << endl;
  43. }
  44. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注