最小生成树模板。注意读入方法。
输入:
9
A 2 B 12 I 25
B 3 C 10 H 40 I 8
C 2 D 18 G 55
D 1 E 44
E 2 F 60 G 38
F 0
G 1 H 35
H 1 I 35
3
A 2 B 10 C 40
B 1 C 20
0
输出:
216
30
#include <stdio.h>
#include <string.h>
#define N 30
#define MaxRoad 78
#define INF 0x3fffffff
int n,top;
struct egge{
int y,w,next;
}e[MaxRoad*2];
int first[N],dis[N],visited[N];
void init(){
int i;
top = 0;
memset(visited,0,sizeof(visited));
memset(first,-1,sizeof(first));
for(i = 1;i<N;i++)
dis[i] = INF;
}
void add(int x,int y,int w){
e[top].y = y;
e[top].w = w;
e[top].next = first[x];
first[x] = top++;
}
int prim(){
int i,j,min,pos,res=0;
for(i = first[1];i!=-1;i=e[i].next)
dis[e[i].y] = e[i].w;
visited[1] = 1;
for(i = 1;i<n;i++){
min = INF;
for(j = 1;j<=n;j++)
if(!visited[j] && dis[j]<min){
pos = j;
min = dis[j];
}
res += min;
visited[pos] = 1;
for(j=first[pos];j!=-1;j=e[j].next)
if(!visited[e[j].y] && e[j].w<dis[e[j].y])
dis[e[j].y] = e[j].w;
}
return res;
}
int main(){
freopen("a.txt","r",stdin);
while(scanf("%d",&n) && n){
int i,j,w,num;
char ch;
init();
for(i = 1;i<n;i++){
scanf(" %c %d",&ch,&num);
while(num--){
scanf(" %c %d",&ch,&w);
j = ch-'A'+1;
add(i,j,w);
add(j,i,w);
}
}
printf("%d\n",prim());
}
return 0;
}