题目概述:
农夫约翰被选举成为了当地村落的村长,他自己有一台高速的宽带,他现在想要把这个宽带分享给村里其他所有的人。自然,家与家之间的连接需要假设宽带,现在给定每两家之间的距离,那么我们要给约翰设计一条宽带架设方法,这条方法要能够连接约翰和其他所有用户,并且总架设长度最短。
算法思想:
挺明显的最小生成树,就是从农夫约翰那个点为起点,然后可以选择按prim的方法来遍历整张图。开一个变量res来记录生成树的总权值。跟POJ2485几乎是一模一样的。
代码部分:
#include <iostream> #include <stdio.h> #include <string> #include <string.h> #include <map> #include <cmath> #include <algorithm> using namespace std; int n; const int INF = 100000000; int cost[117][117]; bool used[117]; int min_cost[117]; int prim() { int res = 0; for (int i = 0; i < n; i++) { min_cost[i] = INF; } min_cost[0] = 0; while (true) { int v = -1; for (int u = 0; u < n; u++) { if (!used[u] && (v == -1 || min_cost[u] < min_cost[v])) v = u; } if (v == -1) break; used[v] = 1; res += min_cost[v]; for (int u = 0; u < n; u++) { min_cost[u] = min(min_cost[u], cost[v][u]); } } return res; } int main() { while (cin >> n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> cost[i][j]; } } memset(used, 0, sizeof(used)); cout << prim() << endl; } return 0; }