题意:
      让你构造一个矩阵,满足每一行的和,和每一列的和都等于他给的,还要判断答案是否唯一,还有一点就是矩阵内所有的数字都是[0,k]范围的。

思路:

      这个题目看完就让我想起了hdu3338,那个题目做了好久啊!哎!对于构造矩阵还是很简单的,我们构造两个点起s点和终点e,建图如下:

s -> 所有行       流量是当前行和

所有行 -> 所有列  流量为k

所有列 -> e       流量为当前列和


这样矩阵就构造好了,如果输出答案就直接去残余网络里面找就行了,下面说一下怎么判断最大流是否唯一,其实这个我们可以通过残余网络来找,只要能在残余网络上找到环就行了,这个结论值存在于无环图中,这里说的无环图是指建图的时候的正向图是无环的,对于这个题目就是无环图,这个题目还有一个坑点,就是一开始我是从终点开始搜直接找环,没有从起点是因为起点已经满流,正向流量全是0,根本跑不懂,但是从终点跑各种超时,超时出翔了,无语了我又枚举所有终点所连接的点开始跑,还是超时,最后是枚举起点所连接的点

开始跑的,500ms AC,我有点蛋疼,理论上对于一个环而言从哪个位置跑都可以找到环,我估计是数据里面给的 "能得到唯一答案" 的数据过多,这样就让很多正向的流量变成0,或者是不至于走了好几层才变成0,哎!这个不科学啊!


#include<stdio.h>
#include<string.h>
#include<queue>#define N_node 810
#define N_edge 350000
#define INF 1000000000

using namespace std;typedef struct
{int to ,next ,cost;
}STAR;typedef struct
{int x ,t;
}DEP;STAR E[N_edge];
DEP xin ,tou;
int list[N_node] ,list1[N_node] ,tot;
int deep[N_node] ,map[405][405];void add(int a ,int b ,int c)
{E[++tot].to = b;E[tot].cost = c;E[tot].next = list[a];list[a] = tot;E[++tot].to = a;E[tot].cost = 0;E[tot].next = list[b];list[b] = tot;
}int minn(int x ,int y)
{return x < y ? x : y;
}bool bfs_deep(int s ,int t ,int n)
{ xin.x = s ,xin.t = 0;queue<DEP>q; q.push(xin);memset(deep ,255 ,sizeof(deep));deep[s] = 0;while(!q.empty()){tou = q.front();q.pop();for(int k = list[tou.x] ;k ;k = E[k].next){xin.x = E[k].to;xin.t = tou.t + 1;if(deep[xin.x] == -1 && E[k].cost){deep[xin.x] = xin.t;q.push(xin);}}}for(int i = 0 ;i <= n ;i ++)list1[i] = list[i];return deep[t] != -1;
}int DFS(int s ,int t ,int flow)
{if(s == t) return flow;int nowflow = 0;for(int k = list1[s] ;k ;k = E[k].next){list1[s] = k;int c = E[k].cost;int to = E[k].to;if(!c || deep[to] != deep[s] + 1) continue;int tmp = DFS(to ,t ,minn(c ,flow - nowflow));nowflow += tmp;E[k].cost -= tmp;E[k^1].cost += tmp;if(nowflow == flow) break;}if(!nowflow) deep[s] = 0;return nowflow;
}int DINIC(int s ,int t ,int n)
{int ans = 0;while(bfs_deep(s ,t ,n)){ans += DFS(s ,t ,INF);}return ans;
}int mark_r;
int mark[N_node];
void DFS_R(int from ,int s)
{for(int k = list[s] ;k && !mark_r ;k = E[k].next){int to = E[k].to;if(k == (from ^ 1) || !E[k].cost) continue;if(mark[to]) mark_r = 1;mark[to] = 1;if(!mark_r) DFS_R(k ,to);mark[to] = 0;}
}int main ()
{int n ,m ,i ,j ,k ,num;int s1 ,s2;while(~scanf("%d %d %d" ,&n ,&m ,&k)){memset(list ,0 ,sizeof(list)) ,tot = 1;int mkk = 0;for(s1 = 0 ,i = 1 ;i <= n ;i ++){scanf("%d" ,&num);add(0 ,i ,num);if(k * m < num) mkk = 1;s1 += num;}for(s2 = 0 ,i = 1 ;i <= m ;i ++){scanf("%d" ,&num);add(i + n ,n + m + 1 ,num);if(k * n < num) mkk = 1;s2 += num;}if(s1 != s2 || mkk){puts("Impossible"); continue;}int mk = tot + 1;for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= m ;j ++)add(i ,j + n ,k);int sum = DINIC(0 ,n + m + 1 ,n + m + 1);if(sum != s1){puts("Impossible"); continue;}mark_r = 0;memset(mark , 0 ,sizeof(mark));mark[n+m+1] = 1;for(i = 1 ;i <= n ;i ++){DFS_R(0 ,i);if(mark_r) break;}if(mark_r){puts("Not Unique");continue;}puts("Unique");int t = 0;for(i = mk ;i <= tot ;i += 2){printf("%d" ,k - E[i].cost);if(++t % m == 0) puts("");else printf(" ");}       }return 0;
}

hdu4888 最大流(构造矩阵)相关推荐

  1. hdu4975 行列和构造矩阵(dp判断唯一性)

    题意:       和hdu4888一样,只不过是数据加强了,就是给你行列的和,让你构造一个矩阵,然后判断矩阵是否唯一. 思路:       构造矩阵很简单,跑一次最大流就行了,关键是判断矩阵的唯一性 ...

  2. POJ 2396 构造矩阵(上下流)

    题意:       要求构造一个矩阵,给你行和,列和,还有一些点的上下范围,输出一个满足题意的矩阵. 思路:       这个题目很经典,这是自己看上下流后接触的第一道题,感觉很基础的一道题目,现在我 ...

  3. hdu 1757 A Simple Math Problem 构造矩阵

    题意:函数f(x), 若 x < 10 f(x) = x. 若 x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + -- + ...

  4. HDU-6470 Count (构造矩阵+矩阵快速幂)

    题目链接 Problem Description Farmer John有n头奶牛. 某天奶牛想要数一数有多少头奶牛,以一种特殊的方式: 第一头奶牛为1号,第二头奶牛为2号,第三头奶牛之后,假如当前奶 ...

  5. BZOJ 3240 构造矩阵+矩阵快速幂

    思路: ax+b cx+d 构造矩阵+矩阵快速幂 (需要加各种特判,,,,我好像加少了- ) //By SiriusRen #include <cstdio> #include <c ...

  6. Matrix Power Series(矩阵快速幂,二分法/构造矩阵套矩阵)

    传送门 题意: 思路: 方法一:(二分) 分析: 奇偶分类讨论: 1.代码: #include <iostream> #include <cstdio> #include &l ...

  7. Tiktok免越狱群控 分享Tiktok引流变现矩阵玩法

    首先了解什么是矩阵? 想必很多小伙伴都不清楚,简单来说就是通过多台手机达到一定的效果.比如你成为500W粉丝视频博主,分5个100wTiktok账号,是一件很难达到的工作,但是如果分成100个5w粉丝 ...

  8. 又见斐波那契数列(矩阵构造+矩阵快速幂)

    //补题~~~ 链接:https://ac.nowcoder.com/acm/problem/15666 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...

  9. pku 1830 开关问题(构造矩阵+高斯消元)

    开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4653   Accepted: 1675 Description ...

最新文章

  1. 【自然语言处理】ACL 2020 清华大学系列论文直播分享
  2. new二维数组的几种方法
  3. 调用Cython时报错: More than one filename match found for utility code Capsule
  4. ABAP开发中常用的两个F4搜索帮助函数的区别
  5. Visual Studio 2017各版本安装包离线下载、安装全教程
  6. ### 学习《C++ Primer》- 8
  7. Visual Studio2017 远程调试 Remote Debugger
  8. 解决Ubuntu下切换到root用户后没有声音问题
  9. python 图像处理_Python中的十大图像处理工具
  10. python循环for...in_python循环while和forin实例
  11. 【Mockplus教程】界面闪烁花屏怎么办?
  12. (转)Inno Setup入门(十七)——Inno Setup类参考(3)
  13. WIN10卡顿,system进程硬盘占用100%,iaStorA警告事件,发出了对设备 \Device\RaidPort0 的重置。
  14. 微信公众号新的消息模板还能换行吗?
  15. 佛说五百年的回眸才换来今生的擦肩而过
  16. 布同:网络服务器的结构设计
  17. SQL语句----CASE WHEN 的用法简介
  18. 小红书笔记下沉的方法和技巧
  19. 酷炫的多选方案,拒绝重复劳动
  20. (1)输入直角三角形的两个直角边的长度a,b,求斜边c的长度 (2) 编写一个程序,用于两个数的交换

热门文章

  1. mybait 转换失败 null处理
  2. 替换RubyGems 镜像
  3. 怎样把android应用部署到手机上
  4. ASP.NET 2.0 – 如何巢状化GridView控件
  5. table表格固定前几列,其余的滚动
  6. 结对项目-四则运算 “软件”之升级版
  7. 看jquery3.3.1学js类型判断的技巧
  8. Python之列表方法
  9. 《白发魔女传》里面的一首诗
  10. 13个风格独特的关于页面(About Pages)设计