链接:http://poj.org/problem?id=1258
题意:求连通所有的farm并消耗最少的fiber。其实就是求最小生成树。水题。
浅谈:先用Kruskal写了一个,没想到超时,过不了。然后再用Prim写,32MS过了。说明Prim在普通图下的确比Kruskal效率高。kruskal更适用于边较少的稀疏矩阵。虽然用Prim过了,但还是有大牛0MS过。也不知道用了什么方法啊
#include<iostream>
#define MAX 105
#define disMAX 100000
using namespace std;
int lowcost[MAX];
int closest[MAX];
int net[MAX][MAX];
int N;int Prim()
{
int i,j,mindis,minone;
int ans=0;
for(i=1;i<=N;i++)
{
lowcost[i]=net[1][i];
closest[i]=1;
}
for(i=0;i<N-1;i++)
{
mindis=disMAX;
for(j=1;j<=N;j++)
if(lowcost[j]&&mindis>lowcost[j])
{
mindis=lowcost[j];
minone=j;
}
ans+=lowcost[minone];
closest[minone]=0;
for(j=1;j<=N;j++)
{
if(lowcost[j]>net[minone][j])
{
lowcost[j]=net[minone][j];
closest[j]=minone;
}
}
}
return ans;
}
int main()
{
int i,j,n,mindis,distance;
while(cin>>n&&n)
{
N=n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cin>>distance;
net[i][j]=distance;
}
mindis=Prim();
cout<<mindis<<endl;
}
return 0;
}