1. 程式人生 > >NOIP2010 關押罪犯

NOIP2010 關押罪犯

pri printf algorithm while code git std pre noip

//二分圖
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=20010,M=100010;
int ver[M<<1],Next[M<<1],lin[N],edge[M<<1];
int n,m,tot;bool vis[M<<1],flag;int v[N];
int l=0,r,mid;

inline int read()
{
    char ch=getchar();int
num=0,f=1; while(!isdigit(ch)){if(ch==-) f=-1; ch=getchar();} while(isdigit(ch)){num=num*10+ch-0; ch=getchar();} return num*f; } inline void add(int x,int y,int z) { ver[++tot]=y; Next[tot]=lin[x]; lin[x]=tot; edge[tot]=z; } void dfs(int x,int color) { if(flag) return
; v[x]=color; for(int i=lin[x];i;i=Next[i]){ if(!vis[i]) continue; int y=ver[i]; if(v[y]==0) dfs(y,3-color); else if(v[y]==color){ flag=1;return ; } } } bool check() { memset(vis,0,sizeof(vis)); memset(v,0,sizeof(v)); flag=0;
for(int i=1;i<=tot;i++) if(edge[i]>mid) vis[i]=1; for(int i=1;i<=n;i++) if(v[i]==0) dfs(i,1); if(flag) return 0; else return 1; } int main() { n=read(),m=read(); for(int i=1;i<=m;i++){ int x,y,z; x=read(),y=read(),z=read(); add(x,y,z);add(y,x,z); r=max(r,z); } while(l!=r){ mid=(l+r)/2; if(check()) r=mid; else l=mid+1; } printf("%d\n",l); return 0; }

NOIP2010 關押罪犯