给出所有村庄的所有通路,找出一条连接所有村庄花费最小的通路。
最小生成树的应用。此处用的是Prim算法。
#include<iostream>
#include<queue>
using namespace std;
struct Graph{
//图邻接矩阵
char data;
int key;
int *adjacency;
}*G;
int n; //村庄数量
int m; //邻接村庄数量
int *parent; //在最短路径中连接村庄的上一个村庄
bool *visited; //标识村庄是否已在最短路径上
int *key; //本村庄离已有通路的村庄的最短距离
void Create(){
//初始化
parent = new int[n];
visited = new bool[n];
G = new Graph[n];
for(int i=0; i<n; i++){
G[i].adjacency = new int[n];
G[i].key = 1<<30;
visited[i] = false;
parent[i] = -1;
for(int j=0; j<n; j++){
G[i].adjacency[j] = 0;
}
}
for(int i=0; i<n-1; i++){
cin>>G[i].data;
cin>>m;
for(int j=0; j<m; j++){
char c;
int pow;
cin>>c>>pow;
G[i].adjacency[c - 'A'] = G[c - 'A'].adjacency[i] = pow;
}
}
G[n-1].data = n - 1 + 'A';
}
int Prim(){
int result = 0; //累加结果
G[0].key = 0;
for(int j=0; j<n; j++){
int min = 0;
for(int k=1; k<n; k++){
if(G[min].key > G[k].key){
min = k;
}
}
visited[min] = true;
result += G[min].key;
G[min].key = 1<<30;
for(int i=0; i<n; i++){
if(!visited[i] && G[min].adjacency[i] && G[min].adjacency[i] < G[i].key){
parent[i] = min;
G[i].key = G[min].adjacency[i];
}
}
}
return result;
}
int main(){
while(cin>>n && n!=0){
Create();
cout<<Prim()<<endl;
}
return 0;
}