直接上代码,没什么好说的。
#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;
}