题目是一个矩阵,每行每列的数字的和都有一个上限,问是否存在可行方案,并且可行方案是否唯一。

第一问比较简单,行列建图,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相关推荐

  1. HDU 4888 Redraw Beautiful Drawings(网络流求矩阵的解)

    论文<为什么很多网络流问题总有整数解>http://diaorui.net/archives/189: 参考:http://www.cnblogs.com/yuiffy/p/3929369 ...

  2. HDU 4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

    题意:给定n*m个格子,每个格子能填0-k 的整数.然后给出每列之和和每行之和,问有没有解,有的话是不是唯一解,是唯一解输出方案. 思路:网络流,一共 n+m+2个点   源点 到行连流量为 所给的 ...

  3. 【最大流】HDU 4888 Redraw Beautiful Drawings

    通道 题意:n*m的矩阵,每个格子可以是0~k,给出各行的和和各列的和,求格子数字唯一方案,或判断无解或不唯一 思路:最大流,每行一个点,每列一个点,起点到每行的点连流量等于这行的和的边,每列的点连流 ...

  4. HDU Redraw Beautiful Drawings 推断最大流是否唯一解

    点击打开链接 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 ...

  5. HDU Redraw Beautiful Drawings 判断最大流是否唯一解

    点击打开链接 Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 ...

  6. hdu 4888 最大流慢板

    http://acm.hdu.edu.cn/showproblem.php?pid=4888 添加一个源点与汇点,建图如下: 1. 源点 -> 每一行对应的点,流量限制为该行的和 2. 每一行对 ...

  7. HDUOJ--4888--Redraw Beautiful Drawings【isap】网络流+判环

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=4888 题意:一个矩阵.限定每行行和.列和,每一个格子数字不超过k,问矩阵是否存在,如存在推断有单解还是多 ...

  8. 【翻译】使用Sencha Ext JS创建美丽的图画(1)

    原文: Creating Beautiful Drawings Using Sencha Ext JS – Part 1 许多人可能对Ext JS中的图表包相当熟悉了.通过它可以快速创建相当强悍的可视 ...

  9. hdu 5062 Beautiful Palindrome Number(水题)

    题目链接:hdu 5062 Beautiful Palindrome Number 题目大意:略. 解题思路:暴力或者手算都可以,注意手算的话,分别算出1,2,3...位的情况后,答案是累加上去的. ...

最新文章

  1. XT910开通了GPRS却上不了网的原因--“数据漫游”功能关闭导致的
  2. 鸿蒙系统出来没有,呜呼哀哉!历尽艰辛研发出鸿蒙系统,却无厂商敢用
  3. 他是哈佛计算机博士,却成落魄画家,后逆袭为硅谷创业之父 |人物志
  4. 机器学习竞赛(代码)
  5. 关于SQL语句中的双引号、单引号和
  6. 手机充当电脑摄像头:无他相机和DroidCam
  7. 前端之JS篇(七)——Web APIsDOM部分内容
  8. 杭州好玩景点攻略884
  9. 东南大学计算机科学沈桥,走进东南大学,金中学子要做“未来卓越工程师”!...
  10. HTML表格、列表、表单
  11. POJ 1723(中位数+连续排列)
  12. MOOC人工智能原理学习笔记1
  13. crmeb多商户公测版发布
  14. window10安装Mac虚拟机详细教程
  15. 拼多多校招内推编程题2 大整数乘法
  16. acmev2怎么用_lua-resty-acme: ACMEv2 客户端和 Let's Encrypt 证书的自动化管理
  17. ZYNQ-ZedBoard 上运行桌面 LINUX
  18. python入门之python编程语言(简介)
  19. 【易通慧谷】供应链金融主要模式及对商业银行的影响
  20. R-studio数据恢复软件使用教程

热门文章

  1. 解密:阿里巴巴公司根据截图查到泄露信息的员工的技术是?
  2. python爬取大众点评数据
  3. 四核处理器_国产迷你PC主机评测:128GB,搭载四核处理器,仅掌心大小
  4. 恐怖黎明 联网显示无法连接服务器,《恐怖黎明》一直连接不到特定好友游戏解决方法分享...
  5. me检测到的车道线投影到相机坐标系下
  6. padding外边距
  7. 【ACM】D学长 熟能生巧
  8. Android小程序-乐学成语游戏(四)
  9. 如何解决深度VISTA GV2.0子网掩码多了一个141.41.94.121的问题!
  10. PhotoshopCS5 第三篇 创建选区