hdu 4888 Redraw Beautiful Drawings
题目是一个矩阵,每行每列的数字的和都有一个上限,问是否存在可行方案,并且可行方案是否唯一。
第一问比较简单,行列建图,s到每个行节点容量为该行上限,每个列节点连接到t,容量为该列的上限,求最大流,如果满流则有可行方案。第二问就是判断最大流是否唯一,就是在原图中找一个环(经过一条边后不能马上走反向边),环上的边cap-flow都大于0。如果有这个环,那么不唯一,否则唯一。因为流量为k的两个流量图的差别肯定是一个个的环,否则流量不相同,只要按照这个环进行流量的重新分配就可以找到另一个方案。
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> using namespace std; #define maxn 1000 #define INF 10000000 struct Edge {int from, to, cap, flow; }edges[360000];int n, m, s, t, kk, cnt; vector<int> G[maxn]; // 邻接表,G[i][j]表示结点i的第j条边在e数组中的序号 bool vis[maxn]; // BFS使用 int d[maxn]; // 从起点到i的距离 int cur[maxn]; // 当前弧指针 int map[410][410]; void AddEdge(int from, int to, int cap) {edges[cnt].from=from;edges[cnt].to=to;edges[cnt].cap=cap;edges[cnt].flow=0;G[from].push_back(cnt);cnt++;edges[cnt].from=to;edges[cnt].to=from;edges[cnt].cap=0;edges[cnt].flow=0;G[to].push_back(cnt);cnt++; } bool BFS() {memset(vis, 0, sizeof(vis));queue<int> Q;Q.push(s);vis[s] = 1;d[s] = 0;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] = 1;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[x] + 1 == d[e.to] && (f = DFS(e.to, min(a, e.cap-e.flow))) > 0){e.flow += f;edges[G[x][i]^1].flow -= f;flow += f;a -= f;if(a == 0) break;}}return flow; } int Maxflow() {int flow = 0;while(BFS()){memset(cur, 0, sizeof(cur));flow += DFS(s, INF);}return flow; }int dfs(int x,int fa) {int i;for(i=0;i<G[x].size();i++){int v=edges[G[x][i]].to;int cap=edges[G[x][i]].cap;int flow=edges[G[x][i]].flow;if(v==fa) continue;if(v!=s&&v!=t&&cap-flow){if(vis[v]) return 1;vis[v]=1;if(dfs(v,x)) return 1;vis[v]=0;}}return 0; } int main() {while(scanf("%d%d%d",&n,&m,&kk)!=EOF){int i,j,x;int flag=0;int sum1=0,sum2=0;s=0;t=n+m+1;cnt=0;for(i=0;i<=t;i++) G[i].clear();for(i=1;i<=n;i++) {scanf("%d",&x); sum1+=x; AddEdge(s,i,x);}for(i=1;i<=m;i++) {scanf("%d",&x); sum2+=x; AddEdge(i+n,t,x);}if(sum1!=sum2) {printf("Impossible\n"); continue;}for(i=1;i<=n;i++)for(j=1;j<=m;j++)AddEdge(i,j+n,kk);if(Maxflow()!=sum1) {printf("Impossible\n"); continue;}memset(vis,0,sizeof(vis));for(i=1;i<=n;i++){vis[i]=1;if(dfs(i,-1)){flag=1;break;}vis[i]=0;}if(flag==1) printf("Not Unique\n");else{printf("Unique\n");for(j=1;j<=n;j++)for(i=0;i<G[j].size();i++){int v=edges[G[j][i]].to;if(v!=s)map[j][v-n]=edges[G[j][i]].flow;}for(i=1;i<=n;i++){printf("%d",map[i][1]);for(j=2;j<=m;j++)printf(" %d",map[i][j]);printf("\n");}}}return 0; }
转载于:https://www.cnblogs.com/vermouth/p/4004105.html
hdu 4888 Redraw Beautiful Drawings相关推荐
- HDU 4888 Redraw Beautiful Drawings(网络流求矩阵的解)
论文<为什么很多网络流问题总有整数解>http://diaorui.net/archives/189: 参考:http://www.cnblogs.com/yuiffy/p/3929369 ...
- HDU 4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)
题意:给定n*m个格子,每个格子能填0-k 的整数.然后给出每列之和和每行之和,问有没有解,有的话是不是唯一解,是唯一解输出方案. 思路:网络流,一共 n+m+2个点 源点 到行连流量为 所给的 ...
- 【最大流】HDU 4888 Redraw Beautiful Drawings
通道 题意:n*m的矩阵,每个格子可以是0~k,给出各行的和和各列的和,求格子数字唯一方案,或判断无解或不唯一 思路:最大流,每行一个点,每列一个点,起点到每行的点连流量等于这行的和的边,每列的点连流 ...
- HDU Redraw Beautiful Drawings 推断最大流是否唯一解
点击打开链接 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 ...
- HDU Redraw Beautiful Drawings 判断最大流是否唯一解
点击打开链接 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 ...
- hdu 4888 最大流慢板
http://acm.hdu.edu.cn/showproblem.php?pid=4888 添加一个源点与汇点,建图如下: 1. 源点 -> 每一行对应的点,流量限制为该行的和 2. 每一行对 ...
- HDUOJ--4888--Redraw Beautiful Drawings【isap】网络流+判环
链接:http://acm.hdu.edu.cn/showproblem.php? pid=4888 题意:一个矩阵.限定每行行和.列和,每一个格子数字不超过k,问矩阵是否存在,如存在推断有单解还是多 ...
- 【翻译】使用Sencha Ext JS创建美丽的图画(1)
原文: Creating Beautiful Drawings Using Sencha Ext JS – Part 1 许多人可能对Ext JS中的图表包相当熟悉了.通过它可以快速创建相当强悍的可视 ...
- hdu 5062 Beautiful Palindrome Number(水题)
题目链接:hdu 5062 Beautiful Palindrome Number 题目大意:略. 解题思路:暴力或者手算都可以,注意手算的话,分别算出1,2,3...位的情况后,答案是累加上去的. ...
最新文章
- XT910开通了GPRS却上不了网的原因--“数据漫游”功能关闭导致的
- 鸿蒙系统出来没有,呜呼哀哉!历尽艰辛研发出鸿蒙系统,却无厂商敢用
- 他是哈佛计算机博士,却成落魄画家,后逆袭为硅谷创业之父 |人物志
- 机器学习竞赛(代码)
- 关于SQL语句中的双引号、单引号和
- 手机充当电脑摄像头:无他相机和DroidCam
- 前端之JS篇(七)——Web APIsDOM部分内容
- 杭州好玩景点攻略884
- 东南大学计算机科学沈桥,走进东南大学,金中学子要做“未来卓越工程师”!...
- HTML表格、列表、表单
- POJ 1723(中位数+连续排列)
- MOOC人工智能原理学习笔记1
- crmeb多商户公测版发布
- window10安装Mac虚拟机详细教程
- 拼多多校招内推编程题2 大整数乘法
- acmev2怎么用_lua-resty-acme: ACMEv2 客户端和 Let's Encrypt 证书的自动化管理
- ZYNQ-ZedBoard 上运行桌面 LINUX
- python入门之python编程语言(简介)
- 【易通慧谷】供应链金融主要模式及对商业银行的影响
- R-studio数据恢复软件使用教程
热门文章
- 解密:阿里巴巴公司根据截图查到泄露信息的员工的技术是?
- python爬取大众点评数据
- 四核处理器_国产迷你PC主机评测:128GB,搭载四核处理器,仅掌心大小
- 恐怖黎明 联网显示无法连接服务器,《恐怖黎明》一直连接不到特定好友游戏解决方法分享...
- me检测到的车道线投影到相机坐标系下
- padding外边距
- 【ACM】D学长 熟能生巧
- Android小程序-乐学成语游戏(四)
- 如何解决深度VISTA GV2.0子网掩码多了一个141.41.94.121的问题!
- PhotoshopCS5 第三篇 创建选区