标签:最小生成树
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