Problem Description
大武汉一直流传着这样一个传说:
玩在武大,学在华科,爱在华师,吃在湖工。。。
大武汉有N所高校,现在打算在他们之间建立一个局域网,使它们之间能够相互连通。
但是铺网线是要钱的。。。
怎样才能找到一个最省钱的方法呢。
Input
输入包含多组测试数据
第一行给出学校的数目N,(3 <= N <= 110);
接下来一个N*N的矩阵,代表学校i到学校j铺设网络的花费
Output
输出花钱最少的钱数
(所有数值小于2^31)
Sample Input
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
Sample Output
28
#include<stdio.h> int a[111][111]; typedef struct{ int adj;//保存符合要求的点 int lowcost;//某顶点与已构造好的部分生成树的顶点之间的最小权值 }closeedge;//辅助结构体 closeedge close[111];//辅助数组 int main() { int n,i,j,min,sum,k; while(scanf("%d",&n)!=EOF) { sum=0;//记录最小生成树的总权值 for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&a[i][j]); for(i=2;i<=n;i++)//辅助数组初始化,这里我先把1这个顶点拉入到生成树中 { close[i].adj=1; close[i].lowcost=a[1][i]; } close[1].lowcost=0;//1顶点进入最小生成树中 for(i=1;i<n;i++)//寻找其余n-1个顶点 { min=2147483647; for(j=1;j<=n;j++)//找到符合要求的最小权值点 if(close[j].lowcost<min&&close[j].lowcost!=0) { min=close[j].lowcost; k=j; } sum+=min; close[k].lowcost=0;//顶点k进入生成树 for(j=1;j<=n;j++)//新顶点进入生成树之后,修改辅助数组 if(a[k][j]<close[j].lowcost) { close[j].adj=k; close[j].lowcost=a[k][j]; } } printf("%d ",sum); } return 0; }