1. 程式人生 > >LG-P1525 關押罪犯

LG-P1525 關押罪犯

題目連結

從程式碼上看,這題就是 這題 的加強版吧,雖然思考過程有點不同。

這題,很顯然就是求最小值最大,二分跳水。

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