基本思想:
感觉以后要注意一下,最小生成树里面有几个坑:
1.自环问题;
2.两节点间拥有多重路径;
关键点:
Prim基础版本无需考虑自环问题;
#include<iostream> #include<stdlib.h> #include<vector> #include<string> using namespace std; const int maxn = 28; const int INF = 100000000; int ma[maxn][maxn]; bool vis[maxn]; int dis[maxn]; int num,n; int prim() { dis[0] = 0; int ans = 0; for (int u = 0; u < n; u++) { int index = -1; int Min = INF; for (int i = 0; i < n; i++) { if (!vis[i] && dis[i] < Min) { index = i; Min = dis[i]; } } if (index == -1) return -1; vis[index] = true; ans += dis[index]; for (int i = 0; i < n; i++) { if (!vis[i] && ma[index][i] != INF && dis[i] > ma[index][i]) { dis[i] = ma[index][i]; } } } return ans; } void init() { fill(ma[0], ma[0] + maxn * maxn, INF); fill(vis, vis + maxn, false); fill(dis, dis + maxn, INF); } int main() { while (cin >> num) { if (num == 0) return 0; init(); char a, b; int m, d; char most = 'A'; for (int i = 0; i < num-1; i++) { cin >> a >> m; if (a > most) most = a; for (int j = 0; j < m; j++) { cin >> b >> d; if (most < b) most = b; if(ma[a - 'A'][b - 'A']>d) ma[a - 'A'][b - 'A'] = ma[b - 'A'][a - 'A'] = d; } } n = most - 'A' + 1; int ans = prim(); cout << ans << endl; } return 0; }