题目链接:http://poj.org/problem?id=1258
题目意思:给出 n 个 farm,每个farm 之间通过一定数量的fiber 相连,问使得所有farm 直接或间接连通的 最少 fiber 数是多少。
赤裸裸的最小生成树,用prim做的。
有个地方写错,wa 了 几次。
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 const int farm_num = 10000 + 10; 6 const int INF = 1e9; 7 int farm[farm_num][farm_num]; 8 int dist[farm_num], vis[farm_num]; 9 int ans, N; 10 11 void prim() 12 { 13 int k; 14 for (int i = 1; i <= N; i++) 15 { 16 vis[i] = 0; 17 dist[i] = INF; 18 } 19 // 假设从编号为 1 的farm 出发 20 dist[1] = 0, ans = 0; 21 for (int i = 1; i <= N; i++) 22 { 23 int tmp = INF; 24 for (int j = 1; j <= N; j++) 25 { 26 if (!vis[j] && dist[j] < tmp) 27 { 28 tmp = dist[j]; 29 k = j; 30 } 31 } 32 vis[k] = 1; 33 ans += tmp; 34 for (int j = 1; j <= N; j++) 35 { 36 if (!vis[j] && dist[j] > farm[k][j]) // 一开始将dist[j] > farm[k][j]直接写成farm[k][j]了= = 37 dist[j] = farm[k][j]; 38 } 39 } 40 } 41 42 int main() 43 { 44 while (scanf("%d", &N) != EOF) 45 { 46 for (int i = 1; i <= N; i++) 47 { 48 for (int j = 1; j <= N; j++) 49 scanf("%d", &farm[i][j]); 50 } 51 prim(); 52 printf("%d ", ans); 53 } 54 return 0; 55 }