标签:最小生成树
3 1 2 1 0 1 3 2 0 2 3 4 0 3 1 2 1 0 1 3 2 0 2 3 4 1 3 1 2 1 0 1 3 2 1 2 3 4 1 0
3 1 0
题意:求最少的修路价格
题解:Prime算法 最小生成树 从1开始 感觉不是很难 懒得多说了就 直接上代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 111;
const int inf = 0x3f3f3f3f;
int gra[maxn][maxn];
int dist[maxn];
bool vis[maxn];
int n;
int prime();
int main(){
while(scanf("%d", &n)!=EOF && n){
memset(gra, inf, sizeof(gra));
memset(vis, false, sizeof(vis));
int a, b, cost, state;
for(int i = 0; i < n*(n-1)/2; ++i){
scanf("%d%d%d%d", &a, &b, &cost, &state);
if(state == 0){
gra[a][b] = gra[b][a] = cost;
}
else{
gra[a][b] = gra[b][a] = 0;
}
}
printf("%d\n", prime());
}
return 0;
}
int prime(){
int sum = 0;
int mi, index;
for(int i = 1; i <= n; ++i){
dist[i] = gra[1][i];
}
vis[1] = true;
dist[1] = inf;
for(int i = 1; i < n; ++i){
mi = inf;
for(int j = 1; j <= n; ++j){
if(!vis[j] && dist[j] < mi){
mi = dist[j];
index = j;
}
}
sum += dist[index];
vis[index] = true;
for(int j = 1; j <= n; ++j){
if(!vis[j] && dist[j] > gra[index][j]){
dist[j] = gra[index][j];
}
}
}
return sum;
}标签:最小生成树
原文地址:http://blog.csdn.net/u012431590/article/details/45974535