POJ 1815 Friendship 最小割

来源:互联网 发布:两个域名指向一个主机 编辑:程序博客网 时间:2024/04/29 13:08

题意是输出一个字典序最小最小割方案。

我只能想到枚举每个点,不知道有没有更好的。。。

//#pragma comment(linker, "/STACK:102400000,102400000")#include<cstdio>#include<cstring>#include<vector>#include<queue>#include<cmath>#include<cctype>#include<string>#include<algorithm>#include<iostream>#include<ctime>#include<map>#include<set>using namespace std;#define MP(x,y) make_pair((x),(y))#define PB(x) push_back(x)typedef long long LL;//typedef unsigned __int64 ULL;/* ****************** */const int INF=1000111222;const double INFF=1e100;const double eps=1e-8;const int mod=1000000007;const int NN=505;const int MM=401010;/* ****************** */struct G{    int v,cap,next;}E[NN*NN*8];int p[NN],T;int dd[NN],tp[NN],qw[NN];int re[NN],ans[NN];void add(int u,int v,int f){    E[T].v=v;    E[T].cap=f;    E[T].next=p[u];    p[u]=T++;    E[T].v=u;    E[T].cap=0;    E[T].next=p[v];    p[v]=T++;}bool find_path(int st,int en,int n){    int i,u,v,head,tail;    for(i=0;i<=n;i++)    {        dd[i]=-1;    }    dd[st]=0;    qw[head=tail=0]=st;    while(head<=tail)    {        u=qw[head++];        for(i=p[u];i+1;i=E[i].next)        {            v=E[i].v;            if(dd[v]==-1 && E[i].cap>0)            {                dd[v]=dd[u]+1;                qw[++tail]=v;            }        }    }    return (dd[en]!=-1);}int dfs_flow(int u,int &en,int f){    if(u==en || f==0)        return f;    int temp,flow=0;    for( ; tp[u]+1 ; tp[u] = E[tp[u]].next )    {        G &e=E[tp[u]];        if(dd[e.v]==dd[u]+1)        {            temp=dfs_flow(e.v,en,min(f,e.cap));            if(temp>0)            {                e.cap-=temp;                E[tp[u]^1].cap+=temp;                flow+=temp;                f-=temp;                if(f==0)                    break;            }        }    }    return flow;}int dinic(int st,int en,int n){    int i,ans=0;    while( find_path(st,en,n) )    {        for(i=0;i<=n;i++)            tp[i]=p[i];        ans+=dfs_flow(st,en,INF);    }    return ans;}int main(){    int st,en,i,j,n;    int pre,temp,t;    int tol;    bool fg;    while(scanf("%d%d%d",&n,&st,&en)!=EOF)    {        fg=false;        memset(p,-1,sizeof(p));        T=0;        for(i=1;i<=n;i++)            for(j=1;j<=n;j++)            {                scanf("%d",&t);                if(t==1)                {                    add(i+n,j,1);                    if(i==st && j==en)                    {                        fg=true;                    }                }            }        for(i=1;i<=n;i++)        {            re[i]=T;            add(i,i+n,1);        }        if(fg)        {            puts("NO ANSWER!");        }        else        {            st+=n;            pre=dinic(st,en,n+n);            tol=0;            for(i=1;i<=n;i++)            {                if(E[re[i]].cap==0)                {                    for(j=0;j<T;j+=2)                    {                        E[j].cap+=E[j^1].cap;                        E[j^1].cap=0;                    }                    temp=0;                }                else                    temp=pre;                E[re[i]].cap=0;                temp+=dinic(st,en,n+n);                if(temp<pre)                {                    pre=temp;                    ans[++tol]=i;                    if(pre==0)                        break;                }                else                {                    E[re[i]].cap=1;                }            }            printf("%d\n",tol);            for(i=1;i<=tol;i++)                printf("%d%c",ans[i],i==tol?'\n':' ');        }    }    return 0;}


0 0
原创粉丝点击