51 nod 1212 无向图最小生成树

来源:互联网 发布:学英语哪个软件好 编辑:程序博客网 时间:2024/05/20 12:20

1212 无向图最小生成树
 收藏
 关注
N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。
Input
第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000)第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)
Output
输出最小生成树的所有边的权值之和。
Input示例
9 141 2 42 3 83 4 74 5 95 6 106 7 27 8 18 9 72 8 113 9 27 9 63 6 44 6 141 8 8
Output示例
37


<span style="font-size:14px;">#include <stdio.h>#include <iostream>using namespace std;#define N 1005#define INF 0x0f0f0f0f#define MAX  10001int n, m;int vis[N], tmp[N], cost[N][N];int Prim(){int k, edge, min_tree = 0;for(int i = 1; i <= n; ++i){tmp[i] = cost[1][i];vis[i] = 0;}vis[1] = 1;for(int i = 1; i <= n - 1; i++){edge = INF;for(int j = 1; k <= n; j++){if(vis[j] == 0 && tmp[j] < edge){edge = tmp[j];k = j;}}if(edge > MAX)return -1;min_tree += edge;for(int j = 1; j <= n; ++j){if(vis[j] == 0 && tmp[j] > cost[k][j])tmp[j] = cost[k][j];}}return min_tree;}int main(){int a, b, c;scanf("%d%d", &n, &m);for(int i = 1; i <= n; ++i){for(int j = 1; j <= n; ++j){cost[i][j] = INF;cost[i][i] = 0;}}for(int i = 1; i <= m; ++i){scanf("%d%d%d", &a, &b, &c);cost[a][b] = cost[b][a] = c;}int ans = Prim();printf("%d\n", ans);return 0;}</span>






0 0
原创粉丝点击