http://poj.org/problem?id=1287
Input
Output
Sample Input
1 0 2 3 1 2 37 2 1 17 1 2 68 3 7 1 2 19 2 3 11 3 1 7 1 3 5 2 3 89 3 1 91 1 2 32 5 7 1 2 5 2 3 7 2 4 8 4 5 11 3 5 10 1 5 6 4 2 12 0
Sample Output
0 17 16 26
题解:$prim$ 算法 最小生成树
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define inf 0x3f3f3f3f
int P, R;
int mp[110][110], dis[110];
bool vis[110];
void prim() {
memset(dis, inf, sizeof(dis));
memset(vis, false, sizeof(vis));
for(int i = 1; i <= P; i ++)
dis[i] = mp[1][i];
dis[1] = 0;
int res = 0;
int temp;
for(int i = 1; i <= P; i ++) {
int minn = inf;
for(int j = 1; j <= P; j ++) {
if(!vis[j] && minn > dis[j]) {
temp = j;
minn = dis[j];
}
}
vis[temp] = true;
for(int j = 1; j <= P; j ++) {
if(!vis[j])
dis[j] = min(mp[temp][j], dis[j]);
}
}
for(int i = 1; i <= P; i ++)
res += dis[i];
printf("%d\n", res);
}
int main() {
while(~scanf("%d", &P)) {
if(!P) break;
memset(mp, inf, sizeof(mp));
scanf("%d", &R);
for(int i = 1; i <= R; i ++) {
int st, en, cost;
scanf("%d%d%d", &st, &en, &cost);
if(cost < mp[st][en]) {
mp[st][en] = cost;
mp[en][st] = mp[st][en];
}
}
prim();
}
return 0;
}
原文:https://www.cnblogs.com/zlrrrr/p/9744778.html