从代码上看,这题就是 这题 的加强版吧,虽然思考过程有点不同。
这题,很显然就是求最小值最大,二分跳水。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=20006,maxm=100006<<1;
int n,m,tot,lnk[maxn],nxt[maxm],son[maxm],w[maxm],vis[maxn];
bool flg_;
int rad()
{
int ret=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}
void dfs(int x,int p,int mx)
{
if (!flg_) return;
if (vis[x]==-1) vis[x]=p;else
{flg_=vis[x]==p;return;}
int nxt_=p^1;
for (int i=lnk[x];i>0&&flg_;i=nxt[i])
if (w[i]>mx) dfs(son[i],nxt_,mx);
}
void add(int z,int x,int y)
{
son[++tot]=y;nxt[tot]=lnk[x];w[lnk[x]=tot]=z;
son[++tot]=x;nxt[tot]=lnk[y];w[lnk[y]=tot]=z;
}
bool check_(int mx)
{
flg_=true;
for (int i=1;i<=n;++i) vis[i]=-1;
for (int i=1;i<=n&&flg_;++i)
if (vis[i]==-1) dfs(i,0,mx);
return flg_;
}
int main()
{
// freopen("swap.in","r",stdin);
// freopen("swap.out","w",stdout);
n=rad();m=rad();
for (int i=1;i<=m;++i) add(rad(),rad(),rad());
int L=0,R=1e9,mid;
while (L<=R)
{
mid=((R-L)>>1)+L;
if (check_(mid)) R=mid-1;else L=mid+1;
}
printf("%d\n",L);
return 0;
}