1. 程式人生 > >洛谷1525關押罪犯——二分

洛谷1525關押罪犯——二分

scan blank sizeof UC body next bool show int

題目:https://www.luogu.org/problemnew/show/P1525

二分答案+二分圖染色。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int n,m,head[20005],xnt,x,y;
ll ans,l,r,z;
bool vis[20005],col[20005];
struct Node{
    int next,to;
    ll c;
}edge[200005];
void add(int x,int
y,ll z) { edge[++xnt].next=head[x]; edge[xnt].to=y; edge[xnt].c=z; head[x]=xnt; } bool dfs(int a,ll mid) { for(int j=head[a],v;j;j=edge[j].next) if(edge[j].c>mid) { v=edge[j].to; if(vis[v]&&col[a]==col[v])return false;
if(vis[v])continue; vis[v]=1; col[v]=(col[a]+1)%2; if(!dfs(v,mid))return false; } return true; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%lld",&x,&y,&z); add(x,y,z);add(y,x,z); r
=max(r,z); } while(l<=r) { memset(col,0,sizeof col); memset(vis,0,sizeof vis); ll mid=(l+r)/2; // printf("(%lld)\n",mid); bool flag=0; for(int i=1;i<=n;i++) if(!vis[i]) { vis[i]=1;col[i]=1; if(!dfs(i,mid)) { flag=1;break; } } if(flag)l=mid+1; else ans=mid,r=mid-1; // printf("(l=%lld r=%lld)\n",l,r); } printf("%lld",ans); return 0; }

洛谷1525關押罪犯——二分