POJ-2485 고속도로 (최소 스패닝 트리)
섬나라 Flatopia는 완벽하게 평평합니다. 불행히도 Flatopia에는 공공 고속도로가 없습니다. 그래서 Flatopia에서는 교통이 어렵습니다. Flatopian 정부는이 문제를 알고 있습니다. 그들은 고속도로 시스템을 벗어나지 않고 어느 한 쌍의 마을 사이를 운전할 수 있도록 고속도로를 건설 할 계획입니다.
Flatopian 마을은 1에서 N까지 번호가 매겨져 있습니다. 각 고속도로는 정확히 두 마을을 연결합니다. 모든 고속도로는 직선을 따릅니다. 모든 고속도로는 양방향으로 사용할 수 있습니다. 고속도로는 서로 자유롭게 교차 할 수 있지만 운전자는 두 고속도로 끝에 위치한 마을에서만 고속도로를 전환 할 수 있습니다.
Flatopian 정부는 건설 할 가장 긴 고속도로의 길이를 최소화하려고합니다. 그러나 그들은 모든 도시가 다른 모든 도시에서 고속도로에 도달 할 수 있도록 보장하기를 원합니다.
입력
첫 번째 줄은 정수 T로, 몇 개의 테스트 케이스가 뒤따 랐는지 알려줍니다.
각 경우의 첫 번째 줄은 마을 수인 정수 N (3 <= N <= 500)입니다. 그런 다음 N 개의 행이 나옵니다. i 번째는 N 개의 정수를 포함하고,이 N 개의 정수 중 j 번째는 마을 i와 마을 j 사이의 거리입니다 (거리는 [1, 65536] 내의 정수 여야 함). 각 테스트 케이스 뒤에는 빈 줄이 있습니다.
출력
각 테스트 케이스에 대해 모든 마을이 연결되도록 건설 할 가장 긴 도로의 길이 인 정수가 포함 된 행을 출력해야하며이 값은 최소값입니다.
샘플 입력
1
3
0 990 692
990 0 179
692 179 0
샘플 출력
692
Hint
거대한 입력, scanf를 권장합니다.
질문 의 의미는 대략 : Flatopia 정부는 여러 마을 사이에 도로를 건설하여 도로 길이를 최소화하고 각 마을을 다른 마을로 연결하는 도로가 최소값입니다. 스패닝 트리 문제. T 데이터 그룹을 포함하여 T를 입력합니다. 각 테스트 데이터의 첫 번째 줄은 마을 수를 나타내는 정수 N (3 <= N <= 500)입니다. 다음 N은 인접 행렬입니다. 결과에는 가장 작은 트리의 가장 긴면의 출력이 필요합니다.
문제의 궁극적 인 목표는 최소 스패닝 트리에서 가장 큰 가장자리를 찾는 것입니다.
문제 해결 아이디어 : 프라임 알고리즘을 사용하여 최소 스패닝 트리를 찾습니다.
프라임 코드는 다음과 같습니다.
#include<stdio.h>
#include<limits.h>
void Prime();
int n;
int a[505][505],b[505],c[505];//b[]表示距离,c[]表示是否能够构成最小生成树
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
Prime();
}
return 0;
}
void Prime()
{
int i,j,sum=0,p,min;
for(i=0;i<n;i++)
{
c[i]=0;
b[i]=a[0][i];
}
c[0]=1;
b[0]=0;
for(i=1;i<n;i++)
{
p=-1;
min=INT_MAX;
for(j=0;j<n;j++)
{
if(!c[j]&&b[j]<min)
{
min=b[j];
p=j;
}
}
c[p]=1;
if(min>sum)//最小生成树中的最大边
{
sum=min;
}
for(j=0;j<n;j++)
{
if(!c[j]&&b[j]>a[p][j])
{
b[j]=a[p][j];
}
}
}
printf("%d\n",sum);
}