hdu4888 最大流(构造矩阵)
题意:
让你构造一个矩阵,满足每一行的和,和每一列的和都等于他给的,还要判断答案是否唯一,还有一点就是矩阵内所有的数字都是[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 最大流(构造矩阵)的更多相关文章
- hdu4975 行列和构造矩阵(dp判断唯一性)
题意: 和hdu4888一样,只不过是数据加强了,就是给你行列的和,让你构造一个矩阵,然后判断矩阵是否唯一. 思路: 构造矩阵很简单,跑一次最大流就行了,关键是判断矩阵的唯一性 ...
- POJ 2396 构造矩阵(上下流)
题意: 要求构造一个矩阵,给你行和,列和,还有一些点的上下范围,输出一个满足题意的矩阵. 思路: 这个题目很经典,这是自己看上下流后接触的第一道题,感觉很基础的一道题目,现在我 ...
- POJ 3233 Matrix Power Series(构造矩阵求等比)
Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak. ...
- Number Sequence(HDU 1005 构造矩阵 )
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- hdu 5015 233 Matrix(构造矩阵)
http://acm.hdu.edu.cn/showproblem.php?pid=5015 由于是个二维的递推式,当时没有想到能够这样构造矩阵.从列上看,当前这一列都是由前一列递推得到.依据这一点来 ...
- [数学-构造矩阵]NEFU 1113
依据题意.我已经推导出tn的公式.ti=ti.a+ti.b,ti.a=5*t(i-1).a+4*t(i-1).b,ti.b=t(i-1).a+t(i-1).b 然而以下居然不能继续推到sn的公式!!! ...
- poj 3735 Training little cats(构造矩阵)
http://poj.org/problem?id=3735 大致题意: 有n仅仅猫,開始时每仅仅猫有花生0颗,现有一组操作,由以下三个中的k个操作组成: 1. g i 给i仅仅猫一颗花生米 2. e ...
- HDU 3306 Another kind of Fibonacci ---构造矩阵***
Another kind of Fibonacci Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- 构造矩阵解决这个问题 【nyoj299 Matrix Power Series】
矩阵的又一个新使用方法,构造矩阵进行高速幂. 比方拿 nyoj299 Matrix Power Series 来说 给出这样一个递推式: S = A + A2 + A3 + - + Ak. 让你求s. ...
随机推荐
- Java基础语法学习
Java基础语法学习 1. 注释 单行注释: //单行注释 多行注释: /*多行注释 多行注释 多行注释 多行注释 */ 2. 关键字与标识符 关键字: Java所有的组成部分都需要名字.类名.变量名 ...
- 来,Consul 服务发现入个门(一看就会的那种)
前言 在微服务架构中,对于一个系统,会划分出多个微服务,而且都是独立开发.独立部署,最后聚合在一起形成一个系统提供服务.当服务数量增多时,这些小服务怎么管理?调用方又怎么能确定服务的IP和端口?服务挂 ...
- Solon 框架详解(九)- 渲染控制之定制统一的接口输出
Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...
- P1601_A+B Problem(高精)(JAVA语言)
思路:BigInteger first blood! //四行搞定 题目背景 无 题目描述 高精度加法,x相当于a+b problem,[b][color=red]不用考虑负数[/color][/b] ...
- 发送请求时携带了参数,但是浏览器network没有显示的排错思路
发送请求时携带了参数,但是浏览器network没有显示的排错思路 不知道大家有没有遇到这样子的情况就是发送请求的时候明明携带了参数,但是浏览器的network中就是没有!请看下图和代码! 我发送请求用 ...
- 有关指针和C语言中的常量
常量类型(五种): 字面常量(2,3,6....) ; enum 定义的枚举常量; 字符常量('a','b'....) ; ...
- [Fundamental of Power Electronics]-PART II-8. 变换器传递函数-8.3 阻抗和传递函数图形的构建
8.3 阻抗和传递函数图形的构建 通常,我们可以通过观察来绘制近似的bode图,这样没有大量混乱的代数和不可避免的有关代数错误.使用这种方法可以对电路运行有较好的了解.在各种频率下哪些元件主导电路的响 ...
- OO_Unit2 关于性能优化与测试的那些事
OO_Unit2 关于性能优化与测试的那些事 OO的第2单元到本周也就正式完结了.尽管这个单元的主旋律是多线程,但"面向对象"的基本思想仍然是我们一切架构与优化的出发点与前提.因此 ...
- python进阶(7)--文件与异常
一.文件读取二.文件写入三.异常四.存储数据 ---------------------------------------分割线:正文-------------------------------- ...
- 【CTF】XCTF 我们的秘密是绿色的 writeup
题目来源:SSCTF-2017 题目链接:https://adworld.xctf.org.cn/task/answer?type=misc&number=1&grade=1& ...