#include <iostream>
using namespace std;
#define N 200
#define MAX 99999999
int mp[N][N];
int low[N];
int flag[N];
int num;
int prim()
{
int sum = 0,i,k,time=1;
flag[0] = 1;
for(i = 1; i < num; i++)
{
low[i] = mp[0][i];
flag[i] = 0;
}
while(time<=num-1)
{
int min = MAX;
int j = 0;
for(k = 1; k < num; k++)
if( low[k] < min && flag[k]==0 )
{
min = low[k];
j = k;
}
sum += min;
flag[j] = 1;
for(k = 1; k < num; k++)
if(mp[j][k] < low[k] && flag[k]==0)
low[k] = mp[j][k];
time++;
}
return sum;
}
int main()
{
int i,j;
while(cin>>num)
{
for(i = 0; i < num; i++)
for(j = 0; j < num; j++)
cin>>mp[i][j];
cout<<prim()<<endl;
}
return 0;
}
图论 生成树 POJ 1258 (prim)
最新推荐文章于 2021-07-26 21:52:37 发布