(KEI) 2183 염소도 (도) [크루스 칼 최소 스패닝 트리 및 이산 세트] +

(파일 IO) : 입력 : road.in 출력 : road.out
시간 제한 : 1000 MS 공간 제약 : 13만1천72킬로바이트의 특정 제한
고토 ProblemSet


제목 설명
데모 기능을 갖춘 양 마을 검사 한 후 검사 팀은 학교 안전에 어린 양에 영향을 미칠 것이다, 도로 양 마을, 황폐 한 도로를 재 구축해야 할 필요성을 느꼈다.
마을 건설 팀이, 거리를 측정 건설 프로그램을 계획하고 시작 구성, 그것은 여러 건물 사이의 빌드 도로 실행 가능한 옵션, 총되었습니다 건물 및 M 미디엄 조각 옵션도. 이 도로는 보장 할 것 N 건물에 접속된다.
마지막 프로그램은, 양 마을은 세계에서 가장 고급스러운 모든 대리석 도로를 구축하고자, 도로는 원활한 방식으로, 양방향 트래픽 및 한 조각이 될 수 있습니다. 이 설계 요구 사항을 달성하기 위해, 자체 내장 된 대리석 공장으로 필요하다!
난이도 대리석의 요구가 대리석의 생산의 최대 길이에 따라 설계되어야 함을 공장 제작. 대리석 공장은 설계 한계를 초과하지 않는 길이를 생성 할 수 있습니다. 길이 예를 들어, 디자인 100 (100) 식물 제조 할 수 100 90 100,90 대리석 길이 등이나 길이를 생성 할 수 없습니다 101 (101) 대리석.
양 마을 예산이 제한되어, 당신은 가능한 한 작게 식물의 디자인 크기를 만드는 계획을 도로 체계를 도울 수 있기를 바랍니다, 당신은 대리석 건물이 마을 양 모두에 연결할 수 있습니다 생성 할 수 있음을 보장 할 수 있습니다. 최소한의 디자인 크기의 식물의 값입니다.


입력
첫 번째 줄에 두 정수를 N M N M, N 마을 양에서 건물의 수를 나타냅니다, M은 도로의 수를 구축 할 수있다.
다음 M 미디엄 라인, 각 라인 세 개의 정수 A i B i 아이, 동성 C i 그곳에 , 건물로부터 발현 A i 아이 , 건물 B i , 길이를 구축 할 수 있습니다 C i 그곳에 도로.
건물에서 그 번호를 참고 1 1 N 두 건물 사이의 도로의 개수 일 수있다.

출력
최소 디자인 크기 대리석 공장 출력.


샘플 입력
. 3. 3
. 1 2 100
2 3 101
. 1 3 99

샘플 출력
(100)


데이터 범위 제한
30 (30) 데이터 % N < = 10 N 1 < = M < = 100 N <= 10, N-1 <= M <= 100 .
100 (100) 데이터 % 1 < = N < = 2000 N 1 < = M < = 10000 1 < = A i B i < = N 1 <= N <= 2000, N-1 <= M <= 10000,1 <= AI, 양방향 <= N , 1 < = C i < = 1000000000 1 <= CI <= 1,000,000,000 .



길이의 건설 등으로 1 1 2 , 및 1 1 3 도로, 그것은 할 수 있습니다 3 서로 통신 번째 빌딩 단지 최대 100 (100) 구조 설계 만 스케일 100 (100) 대리석 공장, 길이에서 생산 될 수있다 100 (100) 99 99 대리석.


아이디어를 해결
최소 스패닝 트리 크루스 칼 머리, 축적 경로를 최대 값을 선택하면 오른쪽 가장자리가된다. (I는 이산 세트를 사용)


코드

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,m,k,fa[2010],xx,yy,ans;
struct c{
    int x,y,z;
}a[10010];
bool cmp(const c&l,const c&r)
{
    return l.z<r.z;
}
int father(int h)
{
    while(h!=fa[h])
        h=fa[h];
    return h;
}
int main(){
    freopen("road.in","r",stdin);
    freopen("road.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
        scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
    sort(a+1,a+m+1,cmp);
    for(int i=1;i<=n;i++)
        fa[i]=i;
	for(int i=1;i<=m;i++)
	{
        xx=father(a[i].x);
        yy=father(a[i].y);
        if(xx!=yy)
        {
            ans=max(ans,a[i].z);
            fa[xx]=yy;
        }
    }
	printf("%d",ans);
}

게시 된 119 개 원래 기사 · 원 찬양 8 · 전망 4899

추천

출처blog.csdn.net/kejin2019/article/details/105162722