poj2485

最小生成树问题:(用prim算法)

/*题意:Flatopia岛要修路,这个岛上有n个城市,要求修完路后,各城市之间可以相互到达,且修的总
路程最短.
求所修路中的最长的路段*/

#include <iostream>
#define MAX 502
using namespace std;
int str[MAX][MAX];
bool visit[MAX];//标记数组,没有加入到树中时为false,加入了为true
int distan[MAX];//用以记录当前树到各个顶点的最小距离(它会被不断的更新,加入一个顶点更新一次)
int n;
int prim()//prim算法
{
int v,i,j,maxi=0;
visit[
0]=true;//将第一个顶点加入树中
for(i=0;i<n;i++)//计算只有一个顶点时的distan[i]
distan[i]=str[0][i];

for(j=1;j<n;j++)
{
int mini=65550;
for (i=0;i<n;i++)//找最小的边
{
if(visit[i]==false&&distan[i]<mini)//找出没有在当前树中且权值最小的点
{
mini
=distan[i];
v
=i;
}
}
//cout<<mini<<' ';
visit[v]=true;//标记顶点v,加入生成树中
if(maxi<mini)
maxi
=mini;
for (i=0;i<n;i++)//将生成树的权值更新
{
if(visit[i]==false&&distan[i]>str[v][i])//distan[i]中始终放生成树到顶点i的最小权值
{
distan[i]
=str[v][i];
}
}
}
return maxi;
}

int main()
{
int i,j,t;
cin
>>t;
while(t--)
{
cin
>>n;
for(i=0;i<n;i++)
visit[i]
=false;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf(
"%d",&str[i][j]);
cout
<<prim()<<endl;
}
return 0;
}
posted @ 2011-08-06 10:13  qijinbiao1  阅读(1716)  评论(0编辑  收藏  举报