一个很弱智的问题(关于二分
查看原帖
一个很弱智的问题(关于二分
389540
imfkwk楼主2020/12/24 01:34

为什么右端点需要最大值+1?

我的写法是l=mid+1和r=mid-1然后判断l<=r,这么看来就算不用最大值+1似乎也可以搜到最大值啊。可是为什么实际情况就是不行呢?

#include <bits/stdc++.h>
using namespace std;

int from[200001];
int to[200001];
int weigh[200001];
int head[20001];
int num;

void build(int x,int y,int w)
{
	num++;
	from[num]=head[x];
	to[num]=y;
	weigh[num]=w;
	head[x]=num;
}

int n,m;
int x,y,w;
int l=2147483647,r;

void in(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&w);
		l=min(l,w);
		r=max(r,w);
		build(x,y,w);
		build(y,x,w);
	}
}

int c[200001];
int front;

bool paint(int wei){
	queue<int>q;
	for(int i=1;i<=n;i++){
		if(!c[i]){
			q.push(i);
			c[i]=1;
			while(!q.empty()){
				front=q.front();
				q.pop();
				for(int j=head[front];j>0;j=from[j]){
					if(weigh[j]>=wei){
						if(c[to[j]]==0){
							c[to[j]]=3-c[front];
							q.push(c[to[j]]);
						}
						else if(c[to[j]]==c[front]){
							return 1;
						}
					}
				}
			}
		}
	}
	return 0;
}

int ans;

void solve(){
	 while(l<=r){
	 	memset(c,0,sizeof(c));
	 	int mid=(l+r)/2;
	 	if(paint(mid)){
	 		ans=mid;
	 		l=mid+1;
	 	}
	 	else if(!paint(mid)){
	 		r=mid-1;
	 	}
	 }
	 cout<<ans;
}

int main(){
	in();
	solve();
	return 0;
}

附上自己丑陋的代码()

2020/12/24 01:34
加载中...