从A到F找到最短路即可,由于我不会用prim算法
只能用ku...算法,幸好这道题没有让输出路路径,
所以用ku...算法也行
我通常都是这样写的1.把边存起来2.快排3.并查集
呵呵,过了,还行吧,对了输入注意用scanf
中的%d前加一个空格
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> typedef struct Tedge { int from,to; int dist; }edge; edge dis[100]; int N; int fa[30]; int find(int x) { if(x == fa[x]) return x; fa[x] = find(fa[x]); return(fa[x]); } int cmp(const void *a,const void *b) { return (*(edge *)a).dist - (*(edge *)b).dist; } int main() { int n,sub,m,d,i,count,sum; char ch; while(scanf("%d",&n)==1,n) { N = 0; sub = n; sub -= 1; while(sub--) { scanf(" %c",&ch); dis[N].from = ch - 'A' + 1; scanf("%d",&m); for(i=1;i<m;i++) dis[N+i].from = dis[N].from; while(m--) { scanf(" %c",&ch); scanf("%d",&d); dis[N].to = ch - 'A' + 1; dis[N].dist = d; N++; } } //输入完成 qsort(dis,N,sizeof(edge),cmp); for(i=1;i<=n;i++) fa[i] = i; count =0; sum = 0; for(i=0;i<N;i++) { if(find(dis[i].from) != find(dis[i].to)) { fa[find(dis[i].from)] = find(dis[i].to); sum += dis[i].dist; count++; if(count == (n-1))break; } } printf("%d\n",sum); } return 0; }