首页 > 学院 > 开发设计 > 正文

图结构练习——最小生成树(Prim算法)

2019-11-08 01:54:23
字体:
来源:转载
供稿:网友

Think: 修建路 的问题, 对 PRim算法还是不怎么理解。。加油吧。。。

Problem Description 有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。

Input 输入包含多组数据,格式如下。 第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000) 剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。

Output 每组输出占一行,仅输出最小花费。 Example Input

3 2 1 2 1 1 3 1 1 0

Example Output

2 0

#include<bits/stdc++.h>#define MAX 0x3f3f3f;using namespace std;int Map[1050][1050];int dis[1050];int vis[1050];int Prim (int n);int main() { int n, m; int i, j; int a, b, c; while (cin >> n >> m) { memset(vis, 0, sizeof(vis)); for (i = 1;i <= n;i ++) { for (j = 1;j <= n;j ++) { if (i == j) Map[i][j] = 0; else Map[i][j] = MAX; } } for (i = 1;i <= m;i ++) { cin >> a >> b >> c; if (Map[a][b] > c) { Map[a][b] = Map[b][a] = c; } } int ans = Prim(n); cout << ans << endl; } return 0; } int Prim (int n) { int i, j, t; int sum = 0; vis[0] = 1; for (i = 1;i <= n;i ++) { for (j = 1;j <= n;j ++) { dis[i] = Map[i][j]; } } for (i = 1;i <= n;i ++) { t = i; int MIN = MAX; for (j = 1;j <= n;j ++) { if (MIN > dis[j] && !vis[j]) { MIN = dis[j]; t = j; } } sum = sum + MIN; vis[t] = 1; for (j = 1;j <= n;j ++) { if (Map[t][j] < dis[j]&&!vis[j]) { dis[j] = Map[t][j]; } } } return sum; }/***************************************************User name: Result: AcceptedTake time: 40msTake Memory: 568KBSubmit time: 2017-02-20 15:35:03****************************************************/
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表