直接上代碼,沒什麼好說的。
#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;}