悬关,T23点
查看原帖
悬关,T23点
873786
wangjiajinself楼主2024/10/22 09:51
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int N=2e4+10,M=1e5+10,MAX=1e9+1;
int n,m,ans,col[N],head[N],minn=MAX,maxn=0,cnt,a,b,c;
struct node{
	int a,b,c,nxt;
}edge[M];
inline int read()
{
    int p=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
    return f*p;}
bool cmp(node o,node q){
	return o.c<q.c;
}
void add(int x,int y,int z){
	cnt++;
	edge[cnt].a=x;
	edge[cnt].b=y;
	edge[cnt].c=z;
	edge[cnt].nxt=head[x];
	head[x]=cnt;
}
//void dfs(int x){
//	
//}
bool judge(int mid){
//	int iop=upper_bound(edge+1,edge+m+1)-edge;
//	for(int i=1;i<=n;i++) col[i]=0;
//	for(int i=iop;i<=m;i++){
//		if(col[edge[i].u]==0&&col[edge[i].v]==0){
//			col[edge[i].u]=1,col[edge[i].v]=2;
//		}
//		else if(col[edge[i].u]==0||col[edge[i].v]==0){
//			if(col[edge[i].u]==0){
//				
//			}
//		}
//	}
	for(int i=1;i<=n;i++) col[i]=0;
    queue<int> q;
    for(int i=1;i<=n;i++){
    	if(col[i]) continue;
    	q.push(i);
    	col[i]=1;
    	while(!q.empty()){
    		int k=q.front();
    		q.pop();
    		for(int i=head[k];i;i=edge[i].nxt){
    			if(edge[i].c>mid){
				
    				if(col[edge[i].b]==0){
    					col[edge[i].b]=(col[k]==1?2:1);
    					q.push(edge[i].b);
					}
					else if(col[edge[i].b]==col[k]) return false;
				}
			}
		}
	}
	return true;
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=m;i++){
		a=read(),b=read(),c=read();
		maxn=max(maxn,c),minn=min(minn,c);
		add(a,b,c);
		add(b,a,c);
	}
	int l=0,r=maxn;
//	cout<<minn<<" "<<maxn<<endl;
	while(l<=r){
		int mid=(l+r)/2;
		if(judge(mid)){
			r=mid-1;
			ans=mid;
		}
		else l=mid+1;
	}
	printf("%d",ans);
}
2024/10/22 09:51
加载中...