最小生成树模板。注意读入方法。
输入:
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; }