在一张图上有N个点,点与点之间的连接的花费都已经告诉你了,请你设计一下,如果解决这个“最小生成树”的问题。
输入
首先输入一个数字N(0〈=N〈=100)
然后输入一个N*N的矩阵 其中第i行第j列的数字k表示从点i到点j需要的花费。
输出
一个数字,最少需要多少花费才能使得整张图任意两点都直接或者间接连通(也就是最小生成树的权)
Sample Input
5
0 41 67 34 0
41 0 69 24 78
67 69 0 58 62
34 24 58 0 64
0 78 62 64 0
0
2
0 1
1 0
Sample Output
116
0
1
#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX 101
#define INF 99999999
struct stuLine{
int nFrom;
int nTo;
int nLength;
};
void vInput(int nMap[][MAX],int nN);
int nGetResult(int nMap[][MAX],int nN);
void vOutput(int nResult);
stuLine stuGetMinLine(bool bFrom[],bool bTo[],int nMap[][MAX],int nN);
int main(){
int nNodes;
int nMap[MAX][MAX];
int nResult;
while(1==scanf("%d",&nNodes)){
vInput(nMap,nNodes);
nResult=nGetResult(nMap,nNodes);
vOutput(nResult);
}
return 0;
}
void vInput(int nMap[][MAX],int nN){
int i;
int j;
for(i=1;i<=nN;i++){
for(j=1;j<=nN;j++){
scanf("%d",&nMap[i][j]);
}
}
}
int nGetResult(int nMap[][MAX],int nN){
bool bFrom[MAX];
bool bTo[MAX];
int nResult=0;
int i;
int nCount=1;
stuLine stuTemp;
for(i=1;i<=nN;i++){
bFrom[i]=false;
bTo[i]=true;
}
bFrom[nCount]=true;
bTo[nCount]=false;
while(nCount<nN){
stuTemp=stuGetMinLine(bFrom,bTo,nMap,nN);
nResult+=stuTemp.nLength;
bFrom[stuTemp.nTo]=true;
bTo[stuTemp.nTo]=false;
nCount++;
}
return nResult;
}
stuLine stuGetMinLine(bool bFrom[],bool bTo[],int nMap[][MAX],int nN){
int i;
int j;
int nTemp=INF;
stuLine stuTemp;
for(i=1;i<=nN;i++){
if(bFrom[i]){
for(j=1;j<=nN;j++){
if(bTo[j]){
if(nTemp>nMap[i][j]){
nTemp=nMap[i][j];
stuTemp.nLength=nTemp;
stuTemp.nFrom=i;
stuTemp.nTo=j;
}
}
}
}
}
return stuTemp;
}
void vOutput(int nResult){
printf("%d\n",nResult);
}