天才钱vs学霸周2

Time Limit: 500 MS     Memory Limit: 128 MB
Submit Status

由于上次的游戏中学霸周输了,因此学霸周想出个问题为难天才钱,问题是这样的,有一个n×mn×m的矩阵,每一个格子中有一个整数,周大爷给出了数组A[1⋯n]A[1⋯n](A[i]A[i]表示第ii行的元素之和)以及数组B[1⋯m]B[1⋯m] (B[i]B[i]表示第ii列的元素之和),现在周大爷钱大爷能否给每个格子(i,j)(i,j)填一个整数p[i][j]p[i][j](1≤p[i][j]≤201≤p[i][j]≤20)使得满足周大爷一开始给出的两个数组。钱大爷觉得暴力都可以啊,所以他不想解决这么easy的问题。现在,他决定把问题交给你。

Input

第一行两个整数nn,mm(1≤n,m≤201≤n,m≤20)

第二行n个整数表示A[1⋯n]A[1⋯n](m≤A[i]≤20×mm≤A[i]≤20×m)

第三行m个整数表示B[1⋯m]B[1⋯m] (n≤B[i]≤20×nn≤B[i]≤20×n)

Output

如果能构造出来合法的矩阵输出“Yes”,并换行输出一个n×mn×m的合法矩阵KK,满足数组A[1⋯n]A[1⋯n],B[1⋯m]B[1⋯m]的要求并且1≤K[i][j]≤201≤K[i][j]≤20,反之输出“No”。

Sample input and output

Sample Input Sample Output
2 2
2 2
2 2
Yes
1 1
1 1
1 1
1
2
No

Hint

样例不等于test1

Source

2018 UESTC ACM Training for Graph Theory               
题解:刘汝佳老师白书上有解释,不过没代码Orz... 我们可以利用网络流来解决。建立超级源点s,超级汇点t;s与每一行的和建立一条容量为每一行的和的边,t与每一列的和建立一条容量为每一行的和的边,然后对于每一行的与每一列的和分别建立一条容量为19的边(因为流量可以为零,我们可以让每个和减一,因为最大的数不超过20,所以为19); 然后寻找增广路,加流量直到没有增广路,如果可以做到没有增广路,这有解,否则无解      。                      
 AC代码为:
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#define maxn 1000
#define INF 0x3f3f3f3f using namespace std; struct Edge
{
int from,to,cap,flow;// 顾名思义 from to 容量 流量
Edge(int u,int v,int c,int f):
from(u),to(v),cap(c),flow(f) {}
}; struct Dinic
{
int n,m,s,t;
vector<Edge> edges;
vector<int> G[maxn];
int d[maxn];
int cur[maxn];
bool vis[maxn]; void init(int n)
{
for (int i=0; i<n; i++)
G[i].clear();
edges.clear();
} void Addedge(int from,int to,int cap)
{
// 刘汝佳的板子
edges.push_back(Edge(from,to,cap,0));
edges.push_back(Edge(to,from,0,0));
m = edges.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
} bool BFS()
{
// 建立分层图
memset(vis,false,sizeof(vis));
for (int i=0; i<n; i++) d[i] = INF;
d[s] = 0; vis[s] = true; queue<int> Q;
Q.push(s);
while (!Q.empty())
{
int x = Q.front();
Q.pop();
for (int i=0; i<G[x].size(); i++)
{
Edge e = edges[G[x][i]];
if (!vis[e.to] && e.cap>e.flow)
{
vis[e.to] = true;
d[e.to] = d[x]+1;
Q.push(e.to);
}
}
}
return vis[t];
} int DFS(int x,int a)
{
// 当前弧优化
if (x == t || a == 0)
return a;
int flow = 0,f;
for (int i=cur[x]; i<G[x].size(); i++)
{
Edge& e = edges[G[x][i]];
if (d[e.to] == d[x]+1 && (f = DFS(e.to,min(a,e.cap-e.flow))) > 0)
{
e. flow += f;
edges[G[x][i]^1].flow -= f;// 反边减去f
flow += f;
a -= f;
if (a == 0)
break;
}
}
return flow;
} bool OKA()
{
// 判断是否满流
for (int i=0; i<G[s].size(); i++)
{
Edge e = edges[G[s][i]];
if (e.cap!=e.flow)
return false;
}
return true;
} bool OKB(int R,int C)
{
for (int j=R+1; j<=R+C; j++)
{
Edge& e = edges[G[j][0]];
if (e.cap!=e.flow)
return false;
}
return true;
} void Maxflow(int R,int C)
{
int flow = 0; //
while (BFS())
{
memset(cur,0,sizeof(cur));
flow += DFS(s,INF);
} //
//return flow;//最大流 if (OKA()&&OKB(R,C) )
{
cout<<"Yes"<<endl;
for (int i=1; i<=R; i++)
{
int j;
for (j=1; j<G[i].size()-1; j++)
cout<<edges[G[i][j]].flow+1<<' ';
cout<<edges[G[i][j]].flow+1<<endl;
}
}
else {
cout<<"No"<<endl;
}
cout<<endl;
}
}; int main()
{
Dinic aa;// 统一放在结构体中
int T,R,C,tmp;
int a[30],b[30],c[30],d[30]; aa.init(maxn);
scanf("%d%d",&R,&C);
for (int i=1; i<=R; i++) cin>>a[i];
for (int i=1; i<=C; i++) cin>>b[i];
for (int i=1; i<=R; i++) c[i] = a[i]-C;
for (int i=1; i<=C; i++) d[i] = b[i]-R; for (int i=1; i<=R; i++)
aa.Addedge(0,i,c[i]);// 源点s 建边
for (int i=1; i<=C; i++)
aa.Addedge(R+i,R+C+1,d[i]);// 汇点 t 建边
for (int i=1; i<=R; i++)
for (int j=1; j<=C; j++)
aa.Addedge(i,R+j,19);
aa.s = 0; aa.t = R+C+1;
aa.Maxflow(R,C); return 0;
}

矩阵解压,网络流UESTC-1962天才钱vs学霸周2的更多相关文章

  1. CDOJ 1962 天才钱vs学霸周2【最大流】

    以s=0,t=n+m+1分别为超级源点和超级汇点.网络流中的流量以0为开始,题目要求从1到20,我们先把每个点都减去1,即ai - m,bi - n.然后源点s与n个顶点连容量为ai的路,汇点t与m个 ...

  2. 最小生成树唯一性判断-UESTC1959天才钱vs学霸周

    天才钱vs学霸周 Time Limit: 1000 MS     Memory Limit: 256 MB Submit Status 有一天,天才钱和学霸周闲的无聊玩起了游戏,游戏内容是这样的,现在 ...

  3. UVA 11082 矩阵解压(网络流建模)

    矩阵解压 紫书P374 建模真的是挺难的,如果直接给我这题,我是想不到用网络流的,所以还应多做网路流建模,学会如何转化成网络流 还有,现在用的EK算法是比较慢的,还应去看看Dnic和ISAP,并且理解 ...

  4. [网络流最大流经典][uva 11082][矩阵解压]

    题目大意 分析 #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring ...

  5. UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)

    题意: 知道矩阵的前i行之和,和前j列之和(任意i和j都可以).求这个矩阵.每个格子中的元素必须在1~20之间.矩阵大小上限20*20. 思路: 这么也想不到用网络流解决,这个模型很不错.假设这个矩阵 ...

  6. HDU 4309 Seikimatsu Occult Tonneru (状压 + 网络流)

    题意:输入 n 个城市 m 条边,但是边有三种有向边 a b  c d,第一种是 d 是 0,那么就是一条普通的路,可以通过无穷多人,如果 d < 0,那么就是隧道,这个隧道是可以藏 c 个人, ...

  7. 洛谷P4011 孤岛营救问题(状压+BFS)

    传送门 和网络流有半毛钱关系么…… 可以发现$n,m,p$都特别小,那么考虑状压,每一个状态表示位置以及钥匙的拥有情况,然后每次因为只能走一步,所以可以用bfs求出最优解 然后是某大佬说的注意点:每个 ...

  8. 【UVA11082】Matrix Decompressing(有上下界的网络流)

    题意:给出一个矩阵前i列所有元素的和,和前j行所有元素的和,求这个矩阵解压以后的原型.(答案不唯一) n,m<=20,1<=a[i,j]<=20 思路:这道题把边上的流量作为原先矩阵 ...

  9. [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...

随机推荐

  1. docker项目——搭建飞机大战小游戏

    项目2:搭建打飞机小游戏,验证数据持久化(最底下有链接) 第一步:拉取镜像 [root@localhost docker-image]# docker load < httpd_img.tar. ...

  2. Linux命令实战(二)

    1.printf格式化输出(format and print data) 语法:printf(选项)(参数) 参数 输出格式:指定数据输出时的格式: 输出字符串:指定要输出的数据. 格式替代符 %c ...

  3. CSS(7)--- 通俗讲解清除浮动

    CSS(7)--- 通俗讲解清除浮动 上一篇讲了CSS浮动 博客地址:CSS(6)---通俗讲解浮动(float) 一.理解清除浮动 1.为什么要清除浮动 我们前面说过,浮动本质是用来做一些文字混排效 ...

  4. Vue项目性能优化整理

    以下方式基于 @vue/cli 快速搭建的交互式项目脚手架 1. 路由懒加载 当打包构建应用时,JavaScript 包会变得非常大,影响页面加载.如果我们能把不同路由对应的组件分割成不同的代码块,然 ...

  5. C++中对C的扩展学习新增语法——强制类型转换

    类型转换:主要进行指针类型转换,因为在C++中,不同类型指针不允许隐式转换,任何一个程序中如果出现了大量的类型转换,说明该程序不是太好的程序. 注意事项: 不同类型指针不允许隐式转换: void* 类 ...

  6. ZeroC ICE的远程调用框架 ServantLocator与Locator

    ServantLocator定位的目标是Servant,而Locator定位的目标是“Ice Object”,即一个可定位的“Ice Object”代理.Servant是::Ice::Object的继 ...

  7. opencv 4 图像处理(2 形态学滤波:腐蚀与膨胀,开运算、闭运算、形态学梯度、顶帽、黑帽)

    腐蚀与膨胀 膨胀(求局部最大值)(dilate函数) #include <opencv2/core/core.hpp> #include <opencv2/highgui/highg ...

  8. vue响应式的注意事项

    在html中出现无法显示对象属性的情况,可能是需要在初始化对象时,先定义好属性. <template> <div> <div v-else class="req ...

  9. Python和BeautifulSoup进行网页爬取

    在大数据.人工智能时代,我们通常需要从网站中收集我们所需的数据,网络信息的爬取技术已经成为多个行业所需的技能之一.而Python则是目前数据科学项目中最常用的编程语言之一.使用Python与Beaut ...

  10. 国内开源C# WPF控件库Panuon.UI.Silver强力推荐

    国内优秀的WPF开源控件库,Panuon.UI的优化版本.一个漂亮的.使用样式与附加属性的WPF UI控件库,值得向大家推荐使用与学习. 今天站长(Dotnet9,站长网址:https://dotne ...