二分圖判定
阿新 • • 發佈:2018-12-18
NOIP2010關押罪犯 dfs判定二分圖
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<cctype> #define maxn 200005 using namespace std; int n,m; int Prev[maxn],to[maxn],info[20005],cst[maxn],cnt_e,seq[maxn>>1]; void insert(int u,int v,int w){ cnt_e++; Prev[cnt_e]=info[u];info[u]=cnt_e;to[cnt_e]=v;cst[cnt_e]=w; } int is[20005],MID; bool dfs(int now){ for(int i=info[now];i;i=Prev[i]) if(cst[i]>=MID){ if(is[to[i]]){ if(is[to[i]]==is[now]) return 0; } else { is[to[i]]=is[now]^1; if(!dfs(to[i])) return 0; } } return 1; } bool check(int Mid){ MID=Mid; memset(is,0,sizeof is); for(int i=1;i<=n;i++) if(!is[i]){ is[i]=2; if(!dfs(i)) return 0; } return 1; } int main(){ //freopen("1.in","r",stdin); scanf("%d%d",&n,&m); int u,v,w; for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); insert(u,v,w); insert(v,u,w); seq[i]=w; } sort(seq+1,seq+m+1); int L=1,R=m,Mid,ans; while(L<R){ Mid=(L+R)>>1; if(check(seq[Mid])) ans=seq[Mid],R=Mid; else L=Mid+1; } printf("%d",seq[L-1]); }
也可以用dsu