求助二分图30分
查看原帖
求助二分图30分
717599
dengjunhaodejia09楼主2023/1/9 15:01
#include <bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1,ch=getchar();
	for(;!isdigit(ch);ch=getchar()) f=(ch=='-')?-1:1;
	for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
int head[100001],cnt;
struct node{
	int to,nxt;
}e[100010];
bool f[100010];
void add(int x,int y){
	cnt++;
	e[cnt].to=y;
	e[cnt].nxt=head[x];
	head[x]=cnt;
}
int n,m;
queue <int> q;
int a[100010];
int bfs(){
	for(int i=1;i<=n;i++){
		if(f[i]==false){
			q.push(i);
			f[i]=true;
			a[i]=1;
			while(!q.empty()){
				int o=q.front();
				f[o]=true;
				q.pop();
				for(int j=head[o];j!=0;j=e[j].nxt){
					if(a[e[j].to]!=0){
						if(a[e[j].to]==a[o]){
							return 0;
						}
					}else{
						if(a[o]==1){
							a[e[j].to]=2;
							q.push(e[j].to);
						}else{
							a[e[j].to]=1;
							q.push(e[j].to);
						}
					}
				}
			}
		}
	}
	return 1;
}
struct edge{
	int x,y,z;
}b[1000001];
int cmp(edge g,edge r){
	return g.z>r.z;
}
int main(){
	n=read();
	m=read();
	for(int i=1;i<=m;i++){		
		b[i].x=read();
		b[i].y=read();
		b[i].z=read();	
	}
	sort(b+1,b+m+1,cmp);
	int l=1,r=m,mid=0,ans=-1;
	while(l<=r){
		mid=(l+r)/2;
		memset(a,0,sizeof(a));
		memset(f,false,sizeof(f));
		memset(head,0,sizeof(head));
		for(int i=1;i<=cnt;i++){
			e[i].to=0;
			e[i].nxt=0;
		}
		cnt=0;
		for(int i=1;i<=mid;i++){
			add(b[i].x,b[i].y);
			add(b[i].y,b[i].x);
		}
		if(bfs()==1){
			ans=mid;
			l=mid+1;
		}else{
			r=mid-1;	
		}
	}
	if(ans==m){
		cout<<0;
	}else{
		cout<<b[ans+1].z;
	}		
	return 0;
}
2023/1/9 15:01
加载中...