链接: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