链接:http://poj.org/problem?id=2421 或 http://acm.hdu.edu.cn/showproblem.php?pid=1102
3 0 990 692 990 0 179 692 179 0 1 1 2
179
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> #define MAXN 10005 #define INF 0x1f1f1f1f #define RST(N)memset(N, 0, sizeof(N)) using namespace std; int n, m, res, u, v, w; int low[MAXN], vis[MAXN], Edge[205][205]; /low表示每个点到生成树的最小距离,vis表示一个点是否已加入生成树中,Edge表示图的邻接矩阵; void Init() { RST(low), RST(vis), res = 0; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { scanf("%d", &Edge[i][j]); } } scanf("%d", &m); for(int i=0; i<m; i++) { scanf("%d %d", &u, &v); Edge[u-1][v-1] = Edge[v-1][u-1] = 0; } } int Prim() { vis[0] = 1; for(int i=1; i<n; i++) low[i] = Edge[0][i]; for(int i=1; i<n; i++) { int min = INF, p = -1; for(int j=0; j<n; j++) { if(!vis[j] && low[j] < min) { min = low[j]; p = j; } } if(min == INF) return -1; //说明找不到能够加入的点了,说明图是不连通的; res += min; vis[p] = 1; for(int j=0; j<n; j++) { if(!vis[j] && low[j] > Edge[p][j]) low[j] = Edge[p][j]; } } return res; } int main() { while(~scanf("%d", &n)) { Init(); printf("%d\n", Prim()); } return 0; }
HDU 1102 && POJ 2421 Constructing Roads (经典MST~Prim),布布扣,bubuko.com
HDU 1102 && POJ 2421 Constructing Roads (经典MST~Prim)
原文地址:http://blog.csdn.net/keshacookie/article/details/24995361