链接:
http://poj.org/problem?id=2485
题意:求建造的连通所有村庄的总长度最短的高速公路中,最长的一个分支。
浅谈:水题。练了一下kruskal算法。
题意:求建造的连通所有村庄的总长度最短的高速公路中,最长的一个分支。
浅谈:水题。练了一下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;
}