20pts求助
查看原帖
20pts求助
950927
_luo_gu楼主2024/8/19 12:01
#include <bits/stdc++.h>
using namespace std ;
struct Edge{
	int x ;
	int y ;
	int ang ;
}edge[200005] ;
int fa[400005] , enemy[400005] , n , m ;
bool cmp(Edge a , Edge b){
	return a.ang > b.ang ;
}
int find_root( int x ){
	if( fa[x] == x ){
		return x ;
	}
	return fa[x] = find_root( fa[x] );
}

void make_together( int x , int y ){
	fa[find_root(x)] = find_root(y) ;
	return ;
}
int main(){
	scanf("%d%d" , &n , &m );
	for( int i = 1; i <= m ; i ++ ){
		scanf("%d%d%d" , &edge[i].x , &edge[i].y , &edge[i].ang );
	}
	for( int i = 1 ; i <= n*2 ; i ++ ){
		fa[i] = i ;
		enemy[i] = 0 ;
	}
	sort(edge+1,edge+m+1,cmp) ;
	for( int i = 1 ; i <= m ; i ++ ){
		//由于排序后单调性,首先出现的不满足的一定是最大的不满足的
		//所以可以直接输出
		if( find_root(edge[i].x) == find_root(edge[i].y)){
			printf("%d" , edge[i].ang );
			return 0 ;
		}  
		if( enemy[edge[i].x] == 0){
			enemy[edge[i].x] = edge[i].y ;
		}else{
			make_together( edge[i].x , enemy[edge[i].y]) ;
		}
		if( enemy[edge[i].y] == 0){
			enemy[edge[i].y] = edge[i].x ;
		}else{
			make_together( edge[i].y , enemy[edge[i].x]) ;
		}
	}
	printf("0\n");
	return 0 ;
}

感谢aker!!!好人一生平安

2024/8/19 12:01
加载中...