POJ-2485 고속도로 (최소 스패닝 트리 프라임)

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);
}

추천

출처blog.csdn.net/weixin_46703995/article/details/107445282