关于我二分出来的答案全部比正解大一这档事
查看原帖
关于我二分出来的答案全部比正解大一这档事
200611
MACO楼主2022/7/29 12:25

dalao们为什么我的二分出来的答案比正解要大一? 直接减一混过去了?

#include<bits/stdc++.h>
using namespace std;
const int M=5e5+5;
struct node{
	int to,next,val;
}edge[M];
int head[M],color[M];
int n,m,cnt=0;
void add(int u,int v,int w){
	edge[++cnt].next=head[u];
	edge[cnt].to=v;
	edge[cnt].val=w;
	head[u]=cnt;
}
bool check(int mid){
	memset(color,0,sizeof(color));
	queue<int> q;
	for(int i=1;i<=n;i++){
		if(!color[i]){
			color[i]=1;
			q.push(i);
			while(!q.empty()){
				int now=q.front();
				q.pop();
				for(int i=head[now];i;i=edge[i].next){
					if(edge[i].val<mid) continue;
					int to=edge[i].to;
					if(!color[to]){
						if(color[now]==1) color[to]=2;
						else color[to]=1;
						q.push(to);
					}
					else if(color[to]==color[now]) return false;
				}
			}
		}
	}
	return true;
}
int main()
{
	int l,r=-1,ans=0;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
		r=max(r,w);
	}
	while(l<=r){
		int mid=(l+r)>>1;
		if(check(mid)){
			r=mid-1;
			ans=mid;
		}
		else l=mid+1;	
	}
	if(ans==0) cout<<ans;
	else cout<<ans-1;
	return 0;
}
2022/7/29 12:25
加载中...