社区讨论

一个很弱智的问题(关于二分

P1525[NOIP 2010 提高组] 关押罪犯参与者 4已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@locskdr1
此快照首次捕获于
2023/10/30 19:03
2 年前
此快照最后确认于
2023/11/05 05:45
2 年前
查看原帖
为什么右端点需要最大值+1?
我的写法是l=mid+1和r=mid-1然后判断l<=r,这么看来就算不用最大值+1似乎也可以搜到最大值啊。可是为什么实际情况就是不行呢?
CPP
#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;
}
附上自己丑陋的代码()

回复

7 条回复,欢迎继续交流。

正在加载回复...