社区讨论
一个很弱智的问题(关于二分
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 条回复,欢迎继续交流。
正在加载回复...