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

直接上代码,没什么好说的。
#include<stdio.h>
#include<string.h>
#define LMT 205
#define eps 3e8
typedef 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;
}

你可能感兴趣的:(sgu 194 上下界最大流 此代码SGU瞬间过,ZOJ瞬间WA)