题目:http://www.qscoj.cn/#/problem/show/1962
建立一个源点s和汇点t
每个点预置1后流量最小值就变成了0
将a[i]连接到s,b[i]连接到t
再将每行的点连接到每列,流量为19
再跑一次dinic
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<set> using namespace std; const int N=1e5+5; const int inf=0x3f3f3f3f; int c[105][105]; int a[N],b[N]; int n,m; struct Dinic { int s,t,tot; int head[N],nt[N],to[N],val[N],dep[N],cur[N]; void init(int ss,int tt) { s=ss; t=tt; tot=-1; memset(head,-1,sizeof(head)); memset(nt,-1,sizeof(nt)); } void addedge(int u,int v,int w) { nt[++tot]=head[u]; to[tot]=v; val[tot]=w; head[u]=tot; nt[++tot]=head[v]; to[tot]=u; val[tot]=0; head[v]=tot; } bool bfs() { queue<int> que; while(!que.empty()) que.pop(); memset(dep,0,sizeof(dep)); dep[s]=1; que.push(s); while(!que.empty()) { int u=que.front(); que.pop(); for(int i=head[u];i!=-1;i=nt[i]) if (val[i]>0&&dep[to[i]]==0) { dep[to[i]]=dep[u]+1; que.push(to[i]); } } if (dep[t]==0) return 0; return 1; } int dfs(int u,int dis) { if (u==t) return dis; for(int &i=cur[u];i!=-1;i=nt[i]) if (dep[to[i]]==dep[u]+1&&val[i]>0) { int di=dfs(to[i],min(dis,val[i])); if (di>0) { val[i]-=di; val[i^1]+=di; return di; } } return 0; } int dinic() { int ans=0; while(bfs()) { for(int i=s;i<=t;i++) cur[i]=head[i]; while(int d=dfs(s,inf)) ans+=d; } int flag=1; int s=0; for(int i=1;i<=n;i++) s+=a[i]; if (ans!=s) flag=0; if (flag) { printf("Yes "); for(int i=1;i<=n;i++) for(int j=head[i];j!=-1;j=nt[j]) c[i][to[j]-n]=20-val[j]; for(int i=1;i<=n;i++) { for(int j=1;j<m;j++) printf("%d ",c[i][j]); printf("%d ",c[i][m]); } } else printf("No "); return 0; } }; Dinic dinic; int main() { scanf("%d%d",&n,&m); int t1=0,t2=0; for(int i=1;i<=n;i++) {scanf("%d",&a[i]);a[i]-=m;t1+=a[i];} for(int i=1;i<=m;i++) {scanf("%d",&b[i]);b[i]-=n;t2+=b[i];} if (t1!=t2) { printf("No "); return 0; } dinic.init(0,n+m+1); for(int i=1;i<=n;i++) dinic.addedge(0,i,a[i]); for(int i=1;i<=m;i++) dinic.addedge(i+n,n+m+1,b[i]); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dinic.addedge(i,n+j,19); dinic.dinic(); return 0; }