NOIP2010 關押罪犯
阿新 • • 發佈:2019-01-08
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();intnum=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 關押罪犯