POJ1258 图论(Prim方法)

来源:互联网 发布:淘宝发布话费充值 编辑:程序博客网 时间:2024/05/26 07:28


题目概述:

农夫约翰被选举成为了当地村落的村长,他自己有一台高速的宽带,他现在想要把这个宽带分享给村里其他所有的人。自然,家与家之间的连接需要假设宽带,现在给定每两家之间的距离,那么我们要给约翰设计一条宽带架设方法,这条方法要能够连接约翰和其他所有用户,并且总架设长度最短。

算法思想:

挺明显的最小生成树,就是从农夫约翰那个点为起点,然后可以选择按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;}



0 0