为什么右端点需要最大值+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;
}
附上自己丑陋的代码()