您的位置:首页 > 其它

POJ 2485 Highways

2014-07-26 09:46 393 查看
题目大意:
给定各村间的距离,用最少话费修建通路联通所有村,并得到修建路中最长的那一段。

这一题和之前HDU 1102题极其相似,可我在这用了同样的Kruscal算法却达到了800+ms的时间

我的代码:

#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的最小权值,以前的自不用考虑,每次加进来一个点v,判断str[v][i]
//与distance[i]的大小,并将distance不断做更新即可
{
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;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: