题意:有一个村庄网络(图),求该图的最小生成树
首先输入n代表n个村庄,接下来的n-1行,每行首先输入一个大写字母表示一个村庄,接着输入一个数字num,
表示和村庄连接的点的个数 接下来输入num对大写字母和数字,表示该村庄到另一个村庄的距离。比如:题目的第二组数组
3 A 2 B 10 C 40 B 1 C 20
表示:有三个村庄
A村庄有两个连通的点B C 其中A--->B 距离10 A--->C 距离40
B村庄有一个联通的点C B--->C 距离20
代码:(prim)
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int MAX=50; const int INF=0x3f3f3f3f; int n,val,num; int dist[MAX]; bool vis[MAX]; char st[5],en[5]; int map[MAX][MAX]; int prim() { for(int i=0;i<n;i++) { dist[i]=INF; vis[i]=false; } int min,ans=0,pos; dist[0]=0; for(int i=0;i<n;i++) { min=INF; for(int j=0;j<n;j++) { if(!vis[j]&&dist[j]<min) { min=dist[j]; pos=j; } } vis[pos]=true; ans+=min; for(int j=0;j<n;j++) { if(!vis[j]&&dist[j]>map[pos][j]) dist[j]=map[pos][j]; } } return ans; } int main() { while(scanf("%d",&n)!=EOF&&n) { for(int i=0;i<n;i++) //初始化 for(int j=0;j<n;j++) map[i][j]=INF; for(int i=0;i<n-1;i++) { scanf("%s %d",st,&num); while(num--) { scanf("%s%d",en,&val); //将点ABC 用012代替,构建邻接矩阵 map[st[0]-'A'][en[0]-'A']=map[en[0]-'A'][st[0]-'A']=val; } } int ans=prim(); printf("%d ",ans); } return 0; }