在一张图上有N个点,点与点之间的连接的花费都已经告诉你了,请你设计一下,如果解决这个“最小生成树”的问题。
41 0 69 24 78
67 69 0 58 62
34 24 58 0 64
0 78 62 64 0
Sample Output
116
0
输入:
首先输入一个数字N(0〈=N〈=100)然后输入一个N*N的矩阵 其中第i行第j列的数字k表示从点i到点j需要的花费。
输出:
一个数字,最少需要多少花费才能使得整张图任意两点都直接或者间接连通(也就是最小生成树的权)
Sample Input
5
0 41 67 34 041 0 69 24 78
67 69 0 58 62
34 24 58 0 64
0 78 62 64 0
0
2
0 1
Sample Output
116
0
1
#include <iostream>
#include <string.h>
using namespace std;
#define MAX 109
#define INF 999999
bool V1[MAX],V2[MAX];
int Map[MAX][MAX];
void Input(int N);
void Output(int A);
int Prim(int N);
int Find(int C);
int main(int argc, char *argv[])
{
int Num;
int Ans;
while(cin>>Num)
{
Input(Num);
Ans=Prim(Num);
Output(Ans);
}
return 0;
}
void Input(int N)
{
int i,j;
memset(V1,false,sizeof(V1));
memset(V2,true,sizeof(V2));
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
cin>>Map[i][j];
}
}
}
int Prim(int N)
{
int Count=1;
int Sum=0;
int Min;
V1[1]=true;
V2[1]=false;
while(Count<N)
{
Min=Find(N);
Sum+=Min;
Count++;
}
return Sum;
}
int Find(int C)
{
int i,j;
int min=INF;
int nF,nT;
for(i=1;i<=C;i++)
{
if(V1[i])
{
for(j=1;j<=C;j++)
{
if(V2[j])
{
if(min>Map[i][j])
{
min=Map[i][j];
nF=i;
nT=j;
}
}
}
}
}
V1[nT]=true;
V2[nT]=false;
return min;
}
void Output(int A)
{
cout << A << endl;
}