题目链接:点击查看

题目大意:给出一个 n * m 大小的空矩阵,要求在某些位置放置 1 ,其余位置放置 0 ,使得每行都有恰好 a 个 1 ,且每列恰好有 b 个 1 ,给出一种构造方案或者判断是否可行

题目分析:棋盘问题,加上数据比较小,考虑直接用网络流直接判断是否可行,行列约束可以转换为流量约束,具体建图方式如下:

  1. 源点 -> 每一行,流量为 a
  2. 每一行 -> 每一列,流量为 1
  3. 每一列 -> 汇点,流量为 b

建完图后不难看出,当且仅当 a * n == b * m 才存在满流的情况,所以可以提前判断 NO 的情况,然后用最大流跑出一种可行方案输出即可

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=110;struct Edge
{int to,w,next;
}edge[N*N];int head[N],cnt;void addedge(int u,int v,int w)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;edge[cnt].next=head[v];head[v]=cnt++;
}int d[N],now[N];bool bfs(int s,int t)
{memset(d,0,sizeof(d));queue<int>q;q.push(s);now[s]=head[s];d[s]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(d[v])continue;if(!w)continue;d[v]=d[u]+1;now[v]=head[v];q.push(v);if(v==t)return true;}}return false;
}int dinic(int x,int t,int flow)
{if(x==t)return flow;int rest=flow,i;for(i=now[x];i!=-1&&rest;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(w&&d[v]==d[x]+1){int k=dinic(v,t,min(rest,w));if(!k)d[v]=0;edge[i].w-=k;edge[i^1].w+=k;rest-=k;}}now[x]=i;return flow-rest;
}void init()
{memset(now,0,sizeof(now));memset(head,-1,sizeof(head));cnt=0;
}int solve(int st,int ed)
{int ans=0,flow;while(bfs(st,ed))while(flow=dinic(st,ed,inf))ans+=flow;return ans;
}bool maze[55][55];int main()
{
#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){init();int n,m,a,b;scanf("%d%d%d%d",&n,&m,&a,&b);if(n*a!=m*b){puts("NO");continue;}puts("YES");int st=N-1,ed=st-1;for(int i=1;i<=n;i++)addedge(st,i,a);for(int i=1;i<=m;i++)addedge(i+n,ed,b);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)addedge(i,j+n,1);solve(st,ed);memset(maze,false,sizeof(maze));for(int i=1;i<=n;i++)for(int j=head[i];j!=-1;j=edge[j].next)if(edge[j].w==0&&edge[j].to>n&&edge[j].to<=m+n)maze[i][edge[j].to-n]=true;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)printf("%d",maze[i][j]);puts("");}}return 0;
}

CodeForces - 1360G A/B Matrix(最大流)相关推荐

  1. Codeforces 1080E - Sonya and Matrix Beauty - Manacher

    Codeforces 1080E - Sonya and Matrix Beauty - Manacher 题解链接 https://lucien.ink 题目链接 https://codeforce ...

  2. A/B Matrix CodeForces - 1360G(思维构造)

    You are given four positive integers n, m, a, b (1≤b≤n≤50; 1≤a≤m≤50). Find any such rectangular matr ...

  3. G - A/B Matrix CodeForces - 1360G

    You are given four positive integers n, m, a, b (1≤b≤n≤50; 1≤a≤m≤50). Find any such rectangular matr ...

  4. Codeforces 903F Clear The Matrix(状态压缩DP)

    题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为$'.'$或$'*'$.现在有$4$种正方形可以覆盖掉$'*'$,正方形的边长分别为$1,2,3,4$. 求 ...

  5. Codeforces 362E Petya and Pipes 费用流建图

    题意: 给一个网络中某些边增加容量,增加的总和最大为K,使得最大流最大. 费用流:在某条边增加单位流量的费用. 那么就可以2个点之间建2条边,第一条给定边(u,v,x,0)这条边费用为0 同时另一条边 ...

  6. CodeForces - 510E Fox And Dinner(最大流+奇偶建边+路径打印)

    题目链接:点击查看 题目大意:给出n只狐狸,需要按照下列要求为其安排座位: 每只狐狸必须都要有位置 每张圆桌至少坐三只狐狸 相邻每两只狐狸的年龄和必须是素数 要求判断能否在符合上述要求的情况下分配座位 ...

  7. 【CodeForces - 271B 】Prime Matrix (素数,预处理打表,思维)

    题干: You've got an n × m matrix. The matrix consists of integers. In one move, you can apply a single ...

  8. Codeforces 884E E. Binary Matrix

    题 OvO http://codeforces.com/contest/884/problem/E 884e 解 考虑并查集,每个点向上方和左方的点合并,答案即为1的总数减去需要合并的次数 由于只有1 ...

  9. (最小生成树)Codeforces Educational Codeforces Round 9 Magic Matrix

    You're given a matrix A of size n × n. Let's call the matrix with nonnegative elements magic if it i ...

最新文章

  1. scikit-learn (sklearn) 官方文档中文版
  2. 数据中台建设常见的几大误区,如何规避,你需要知道这几点
  3. MapReduce:简单介绍
  4. tfidf处理代码_tfidf.txt
  5. C程序对整数中设置为1的位数进行计数
  6. CentOS 恢复 rm -rf * 误删数据(转)
  7. 《零基础入门学习Python》学习过程笔记【016列表,元组,字符串的转化及共用技巧】...
  8. 【Computer Organization笔记26】总线 bus :多个部件之间进行数据传送的共享通道,总线设计 - 总线仲裁、数据传输模式、提高总线性能
  9. 自带公网IP上阿里云 | 凌云时刻
  10. lpt监控安装_lpt1(如何在lpt1端口安装打印机)
  11. CSR3026开发问题总结-1
  12. STM32F7xx基于HAL库的USB_CDC接收数据的函数调用
  13. 解决LaTeX中文表格单行文本太长导致水平溢出,表格内长文本换行
  14. 穷人与富人的距离0.05厘米
  15. JavaScript简单的数据总计怎么做?
  16. 蓝桥杯: 调手表【BFS】【Python】
  17. 手机射频技术和手机射频模块基础解读
  18. MYSQL 更改初始 ROOT 密码
  19. 计算机如何配置速度快,怎么设置速度,教您怎么可以让电脑速度变快
  20. 【历史上的今天】5 月 22 日:Windows 3.0 发布;虚幻引擎诞生;《吃豆人》问世

热门文章

  1. pd 生成mysql语句_PDMan + Navicat Premium + MySQL 数据库设计和工具
  2. Redis实现分布式Session管理
  3. Feign-实现抽取
  4. mybatis-批量操作
  5. Hive的基本操作-内置函数
  6. AOP日志-查询日志流程分析
  7. notepad++ 远程连接阿里云服务器
  8. Eureka Server
  9. Oracle数据库管理
  10. jvm参数调优堆的初始和最大值一定要一致