题目:https://www.luogu.org/problemnew/show/P1525
二分答案+二分图染色。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; int n,m,head[20005],xnt,x,y; ll ans,l,r,z; bool vis[20005],col[20005]; struct Node{ int next,to; ll c; }edge[200005]; void add(int x,int y,ll z) { edge[++xnt].next=head[x]; edge[xnt].to=y; edge[xnt].c=z; head[x]=xnt; } bool dfs(int a,ll mid) { for(int j=head[a],v;j;j=edge[j].next) if(edge[j].c>mid) { v=edge[j].to; if(vis[v]&&col[a]==col[v])return false; if(vis[v])continue; vis[v]=1; col[v]=(col[a]+1)%2; if(!dfs(v,mid))return false; } return true; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%lld",&x,&y,&z); add(x,y,z);add(y,x,z); r=max(r,z); } while(l<=r) { memset(col,0,sizeof col); memset(vis,0,sizeof vis); ll mid=(l+r)/2; // printf("(%lld)\n",mid); bool flag=0; for(int i=1;i<=n;i++) if(!vis[i]) { vis[i]=1;col[i]=1; if(!dfs(i,mid)) { flag=1;break; } } if(flag)l=mid+1; else ans=mid,r=mid-1; // printf("(l=%lld r=%lld)\n",l,r); } printf("%lld",ans); return 0; }