#include<cstdio> #include<cstring> #include<vector> #define MAXN 60 #define INF 1000000000 using namespace std; typedef struct{ int v, value; }Edge; typedef vector<Edge> VE; VE eg[MAXN]; bool visited[MAXN]; int LowValue[MAXN]; int Prim(int n){ memset(visited,0, sizeof(visited)); for(int i = 1; i <= n; i++) LowValue[i] = INF; visited[1] = 1; int st = 1; int sum = 0; for(int i = 0; i < eg[1].size(); i++) { //printf("1 -> %d : %d\n", eg[1][i].v, eg[1][i].value); if(eg[1][i].value < LowValue[eg[1][i].v]) LowValue[eg[1][i].v] = eg[1][i].value; } //printf("eg1.size : %d\n", LowValue[2]); for(int i = 1; i < n; i++){ int minV = INF; for(int j = 1; j <= n; j++){ if(!visited[j] && LowValue[j] < minV){ minV = LowValue[j]; //printf("minv:%d\n",minV); st = j; } } sum += minV; visited[st] = 1; //printf("st:%d minV%d\n", st, minV); for(int j = 0; j < eg[st].size(); j++){ if(!visited[eg[st][j].v] && eg[st][j].value < LowValue[eg[st][j].v]) LowValue[eg[st][j].v] = eg[st][j].value; } } return sum; } int main(){ int n, m, a,b,c; Edge e; while(scanf("%d", &n),n){ scanf("%d", &m); for(int i = 1; i <=m; i++){ eg[i].clear(); } for(int i = 0; i < m; i++){ scanf("%d%d%d", &a, &b, &c); e.v = b; e.value = c; eg[a].push_back(e); e.v = a; eg[b].push_back(e); } int len = Prim(n); printf("%d\n", len); getchar(); } return 0; }
prime_poj 1287O(n^2) 邻接表实现
最新推荐文章于 2019-11-09 15:36:24 发布