[二分+最大流] BZOJ1532: [POI2005]Kos-Dicing

来源:互联网 发布:c语言输出等腰三角形 编辑:程序博客网 时间:2024/05/22 14:11

数据范围略有毒…一开始还以为是什么贪心…
其实就直接二分,然后最大流暴力验证一下就好了。

#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;const int maxn=30005,maxe=100005;struct Edge{    int from,to,cap,flow;    Edge(int x1=0,int x2=0,int x3=0,int x4=0):from(x1),to(x2),cap(x3),flow(x4){}} Es[maxe];int N,n,m,d[maxn],nxt[maxe],S,T,fir[maxn],pos[maxn],tot=1;queue <int> que;bool BFS(){    memset(d,63,sizeof(d)); int INF=d[0];    while(!que.empty()) que.pop();     que.push(S); d[S]=0;     while(!que.empty()){        int x=que.front(); que.pop();        for(int j=fir[x];j;j=nxt[j])         if(d[Es[j].to]==INF&&Es[j].cap>Es[j].flow){            d[Es[j].to]=d[x]+1; que.push(Es[j].to);        }    }    return d[T]!=INF;}int find_DFS(int x,int flow){    if(x==T||flow==0) return flow;    int res=0,f;    for(int &j=pos[x];j;j=nxt[j]){        if(d[x]+1==d[Es[j].to]&&(f=find_DFS(Es[j].to,min(flow,Es[j].cap-Es[j].flow)))>0){            Es[j].flow+=f; Es[j^1].flow-=f;             res+=f; flow-=f; if(flow==0) break;        }    }    return res;}int GetMaxFlow(){    int MaxFlow=0,now;    while(BFS()){        for(int i=1;i<=N;i++) pos[i]=fir[i];         MaxFlow+=find_DFS(S,1e+9);    }    return MaxFlow;}void add(int x,int y,int w){    Es[++tot]=Edge(x,y,w,0); nxt[tot]=fir[x]; fir[x]=tot;    Es[++tot]=Edge(y,x,0,0); nxt[tot]=fir[y]; fir[y]=tot;}int ans,mid;bool check(){    for(int i=2;i<=tot;i++) Es[i].flow=0;    for(int j=fir[T];j;j=nxt[j]) Es[j].cap=Es[j^1].cap=mid;    return GetMaxFlow()==m;}int main(){    freopen("bzoj1532.in","r",stdin);    freopen("bzoj1532.out","w",stdout);    scanf("%d%d",&n,&m);    N=n+m+2; S=n+m+1; T=n+m+2;    for(int i=1;i<=m;i++){        int x,y; scanf("%d%d",&x,&y);        add(S,i,1); add(i,m+x,1); add(i,m+y,1);    }    for(int i=1;i<=n;i++) add(m+i,T,1e+9);    int L=1,R=m;    while(L<=R){        mid=(L+R)>>1;        if(check()) R=mid-1, ans=mid;               else L=mid+1;    }    mid=1; check();    printf("%d\n",ans);    return 0;}
原创粉丝点击