您的位置:首页 > 其它

poj2485 Highways

2013-11-29 20:11 239 查看
链接:http://poj.org/problem?id=2485  
题意:求建造的连通所有村庄的总长度最短的高速公路中,最长的一个分支。

浅谈:水题。练了一下kruskal算法。
#include<stdio.h>
#include<stdlib.h>
#define nMAX 505*505
struct highway
{
int v1,v2;
int dis;
}high[nMAX];
int way;
int cmp(const void *p1,const void *p2)
{
return (*(highway *)p1).dis>(*(highway *)p2).dis?1:-1;
}
int seek(int set[],int v)
{
int i=v;
while(set[i]>0)
i=set[i];
return i;
}
int kruskal(int way,int n)
{
int set[nMAX],v1,v2,i,j;
int longest=0;
for(i=1;i<n+1;i++)
set[i]=0;
i=1;
j=1;
while(j<=way-1&&i<=n-1)
{
v1=seek(set,high[j].v1);
v2=seek(set,high[j].v2);
if(v1!=v2)
{
set[v1]=v2;
if(longest<high[j].dis)
longest=high[j].dis;
i++;
}
j++;
}
return longest;
}
int main()
{
int t,n,distance,mindis,i,j;
scanf("%d",&t);
while(t--)
{
way=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&distance);
if(i!=j)
{
high[way].v1=i;
high[way].v2=j;
high[way].dis=distance;
way++;
}
}
qsort(high,way,sizeof(high[0]),cmp);
mindis=kruskal(way,n);
printf("%d\n",mindis);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: