sgu 194 上下界最大流 此代码SGU瞬间过,ZOJ瞬间WA

来源:互联网 发布:那个旅行软件好 编辑:程序博客网 时间:2024/06/05 10:27
直接上代码,没什么好说的。
#include<stdio.h>#include<string.h>#define LMT 205#define eps 3e8typedef struct{    int u,v;}line;line e[LMT*LMT];int mat[LMT][LMT],fmat[LMT][LMT],q[LMT],lev[LMT],lim[LMT][LMT];int n,m;int bfs(int s,int t){    int head,tail,i,j;    memset(lev,0,sizeof(lev));    head=tail=0;    q[tail++]=s;lev[s]=1;    while(head<tail)    {        i=q[head++];        for(j=0;j<=n+1;j++)        if(fmat[i][j]>0&&0==lev[j])        {            lev[j]=lev[i]+1;            q[tail++]=j;        }    }    return lev[t]!=0;}int dfs(int s,int t){    int i,j,top=0,ret=0;    q[top++]=s;    while(top>0)    {        i=q[top-1];        if(i==t)        {            int min,back;            min=eps;            for(i=1;i<top;i++)            if(min>fmat[q[i-1]][q[i]])            {                min=fmat[q[i-1]][q[i]];                back=i;            }            ret+=min;            for(i=1;i<top;i++)            {                fmat[q[i-1]][q[i]]-=min;                fmat[q[i]][q[i-1]]+=min;            }            top=back;        }        else        {            for(j=0;j<=n+1;j++)            if(fmat[i][j]>0&&lev[j]==lev[i]+1)            {                q[top++]=j;                break;            }            if(j>n+1)            {                lev[i]=0;                top--;            }        }    }    return ret;}int dinic(int s,int t){    int ret=0;    while(bfs(s,t))    {       ret+=dfs(s,t);    }    return ret;}int main(){    int i,j,t,sum,N;        scanf("%d%d",&n,&m);        memset(fmat,0,sizeof(fmat));        memset(mat,0,sizeof(lim));        t=0;        for(t=0;t<m;t++)        {            scanf("%d%d",&i,&j);            scanf("%d%d",&lim[i][j],&mat[i][j]);            e[t].u=i;            e[t].v=j;        }        sum=0;        for(i=1;i<=n;i++)        {            t=0;            for(j=1;j<=n;j++)             if(i!=j)             {              fmat[i][j]=mat[i][j]-lim[i][j];              t+=lim[i][j]-lim[j][i];             }          if(t>0)          {           fmat[i][n+1]=t;           sum+=t;          }          else fmat[0][i]=-t;        }        dinic(0,n+1);        for(i=1;i<=n;i++)        if(fmat[0][i]||fmat[i][n+1])        {            printf("NO\n");            break;        }        if(i>n)        {            printf("YES\n");            for(i=0;i<m;i++)printf("%d\n",lim[e[i].u][e[i].v]+fmat[e[i].v][e[i].u]);        }    return 0;}

原创粉丝点击