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;
}