關押罪犯(二分答案+染色法判二分圖)

巴扎嘿呀發表於2020-11-10
#include<bits/stdc++.h>
using namespace std;
const int N=2e4+100;
const int M=2e5+100;
int h[N],v[M],ne[M],e[M],idx;
int n,m;
int color[N];
void add(int a,int b,int c){
	v[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool dfs(int u,int col,int rr){
	color[u]=col;
	for(int i=h[u];i!=-1;i=ne[i]){
		int j=e[i];
		if(v[i]<=rr) continue;
		if(color[j]){
			if(color[j]==color[u]) return false;
		}
		else{
			if(!dfs(j,3-col,rr)) return false;
		}
	}
	return true;
}
bool check(int x){
	memset(color,0,sizeof color);
	for(int i=1;i<=n;i++){
		if(color[i]==0) 
			if(!dfs(i,1,x)) return false;
	}
	return true;
}
int main(){
	memset(h,-1,sizeof h);
	scanf("%d%d",&n,&m);
	int l=0,r=0;
	for(int i=0;i<m;i++){
		int a,b,c;scanf("%d%d%d",&a,&b,&c);
		add(a,b,c);
		add(b,a,c);
		r=max(r,c);
	}
	while(l<r){
		int mid=l+r>>1;
		if(check(mid)) r=mid;
		else l=mid+1;
	}
	printf("%d\n",r);
	return 0;
}

 

相關文章