稠密图的最小生成树
使用prim算法
/*
ID:zhdxzwj1
LANG:C++
PROG:agrinet
*/
#include <bits/stdc++.h>
int flag[102][102];
int seen[102]={0};
int parent[102];
int dist[102]={0};
int main()
{
freopen("agrinet.in","r",stdin);
freopen("agrinet.out","w",stdout);
int n;
scanf("%d",&n);
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
scanf("%d",&flag[i][j]);
}
parent[0]=-1;
seen[0]=1;
for(i=0;i<n;i++)
{
if(flag[0][i]>=0)
dist[i]=flag[0][i];
else
dist[i]=INT_MAX;
}i=0;
int path=0;
while(1)
{
int mi=INT_MAX;
for(k=0;k<n;k++)
if(seen[k]==0&&dist[k]<mi)
{
mi=dist[k];
j=k;
}
if(j==i)
break;
path+=mi;
seen[j]=1;
i=j;
for(k=0;k<n;k++)
{
if(seen[k]==0)
dist[k]=std::min(flag[j][k],dist[k]);
}
}
printf("%d\n",path);
return 0;
}