A. 웜홀 정렬 해체 설정된 최소 스패닝 트리

트리플 A 자격 GDUT 2020 겨울 훈련

원래 제목 링크

이름

원래 제목 샷

outputstandard 출력
농부 존의 소는 자신의 일상 요청 피곤 성장 그들이 일종의 스스로 매일 아침 헛간을 떠나기 전에. 그들은 단지 양자 물리학에서 자신의 박사 학위를 완료하고, 비트 속도 것들에 대한 준비가되어있다.

오늘 아침, 평소와 같이, 농부 존의 N 소 (1≤N≤105)를 편리하게 번호 1 ... N은 또한 소 내가 위치 파이에되도록 1 ... N, 번호, N 별개의 위치에서 헛간에 걸쳐 흩어져있다. 그러나 아침도 (1≤M≤105) M 웜홀 있는데, 내가 양방향 위치 위치와 인공 지능 양방향 연결되고 1≤ai (WI 폭을 가지며, bi≤N을 인공 지능 ≠ BI 웜홀 1 ... M을 넘버링 1≤wi≤109).

어떤 시점에서, 웜홀의 양단에있는 2 마리의 암소가 웜홀을 통해 동시에 스왑 장소에 선택할 수 있습니다. 소 내가 1≤i≤N에 대한 위치 전에서 때까지 소는 스왑을 수행해야합니다.

젖소는 웜홀에 의해 찌그러 얻을 싶어하지 않습니다. 도움말 그들에게 그들 자신을 정렬하는 데 사용해야 가장 넓은 웜홀의 폭을 극대화 할 수 있습니다. 소가 자신을 분류하는 것이 가능하다는 것을 보장한다.

입력
첫번째 라인은 두 정수 N과 M. 포함

두 번째 행은 N 정수의 P1, P2, ..., PN를 포함한다. p는 1 ... N의 순열이 보장된다.
1과 M 사이의 각각의 I, 라인 I + 2 정수, BI, 및 Wi 인공 지능을 포함한다.

출력
단일 정수 : 암소는 선별 과정 자체로 찌그러해야 최대 최소 폭 웜홀. 소가 자신을 정렬 할 웜홀을 필요로하지 않는 경우, 출력 -1.

견본

입력

4 4
3 2 1 4
1 2 9
1 3 7
2 3 10
2 4 3

출력
9

효과에 따라

1 ~ N을 형성하도록 다른 위치에 N-소, 우리는 소 교환 위치하게되므로 배치된다. 지금이 m의 웜홀, 유니콤이 포인트는,이 중동의 특정 폭, 웜홀 소 두 위치를 교환 할 수 있습니다. 이제 우리는 그래서 이러한 가축에 의해 적절한 배치를 수행하는 것이 더 웜홀의 폭보다 최대 폭을 찾을 수있다

사고

우선, 링크 A와 B, B와 유니콤 c에 ABC ABC 세 형태 이십 교환에 의해 임의의 위치에 도달 할 수있다. 세트에서 a와 b는 다음 A와 B는 서로의 위치에 도달 할 수있는 경우이 문제는 다음이다. 그리고 우리가 찾고있는 것은 최대 폭, 교환 작업을 완료 할 수 있습니다 더 웜홀의 폭보다이 사용하는 것입니다. 이 세트는 다음의 모든 사항을 교환 할 포함해야 웜홀 연결 지점의 폭을 형성한다. 그럼 젖소가 잘못된 위치에 다음 같지 읽을 때 [I]는 I와 동일하다 LOC를 결정할 수있다. 웜홀은 다음 높은 순서에 따라, 다음 웜홀을 통과, 판독, 세트로 접속 웜홀 종료한다. 잘못된 위치 모두의 세트가 동일한 설정되어있는 시험은 각 합병 완료 후 교환 작업을 이미 통합되어 한 다음 완료 한 웜홀의 현재 폭의 최대 폭은 요구된다.

이 과정은 매우 최소 스패닝 트리의 과정과 같다.

코드

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<memory.h>
using namespace std;
const int maxn=100007;
struct bian{
	int x,y;
	int w;
}b[maxn];
int loc[maxn];//牛的位置 
int w[maxn];
int n,m;
int wa=0;//错误的位置的牛的个数 
bool cmp(const bian &a,const bian &b)
{
	return a.w<b.w;
}
int fa[maxn];
int getfa(int x)
{
	return fa[x]==x? x:fa[x]=getfa(fa[x]);
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&loc[i]);
		if(loc[i]!=i)
		{
			wa++;
			w[wa]=i;
		}
		fa[i]=i;
	}
	if(wa==0)
	{
		cout<<-1<<endl;
		return 0;
	}
	
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&b[i].x,&b[i].y,&b[i].w);
	}
	sort(b+1,b+m+1,cmp);
	
	for(int i=m;i>=1;i--)
	{
		bool flag=true;
		int fx=getfa(b[i].x);
		int fy=getfa(b[i].y);
		fa[fx]=fy;
		for(int j=1;j<wa;j++)
		{
			if(getfa(w[j])!=getfa(w[j+1]))
			{
				flag=false;
				break;
			}
		}
		if(flag)
		{
			cout<<b[i].w<<endl;
			return 0;
		}
	}
	
	return 0;
}


게시 32 개 원래 기사 · 원 찬양 1 · 조회수 644

추천

출처blog.csdn.net/xcy2001/article/details/104816466