某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
当N为0时,输入结束,该用例不被处理。
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
3 5
裸的Kruskal算法,直接可以套用,没有任何变化。
#include <stdio.h> #include <iostream> #include <algorithm> using namespace std; struct node{ int village_A, village_B; int distance; }s[5050]; int f[105]; bool cmp(node a, node b) { return a.distance < b.distance; } int getf(int v) { if(f[v] != v) { f[v] = getf(f[v]); } return f[v]; } void init(int n) { for(int i = 1; i <= n; i++) { f[i] = i; } } int main() { int n; while(~scanf("%d", &n) && n) { init(n); int sum = 0; int m = n*(n-1)/2; for(int i = 0; i < m; i++) { scanf("%d %d %d", &s[i].village_A, &s[i].village_B, &s[i].distance); } sort(s, s+m, cmp); for(int i = 0; i < m; i++) { int t1 = getf(s[i].village_A); int t2 = getf(s[i].village_B); if(t1 != t2) { sum += s[i].distance; f[t1] = t2; } } printf("%d\n", sum); } return 0; }