题意:

      让你构造一个矩阵,满足每一行的和,和每一列的和都等于他给的,还要判断答案是否唯一,还有一点就是矩阵内所有的数字都是[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. 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. ...

  4. Number Sequence(HDU 1005 构造矩阵 )

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  5. hdu 5015 233 Matrix(构造矩阵)

    http://acm.hdu.edu.cn/showproblem.php?pid=5015 由于是个二维的递推式,当时没有想到能够这样构造矩阵.从列上看,当前这一列都是由前一列递推得到.依据这一点来 ...

  6. [数学-构造矩阵]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的公式!!! ...

  7. poj 3735 Training little cats(构造矩阵)

    http://poj.org/problem?id=3735 大致题意: 有n仅仅猫,開始时每仅仅猫有花生0颗,现有一组操作,由以下三个中的k个操作组成: 1. g i 给i仅仅猫一颗花生米 2. e ...

  8. HDU 3306 Another kind of Fibonacci ---构造矩阵***

    Another kind of Fibonacci Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  9. 构造矩阵解决这个问题 【nyoj299 Matrix Power Series】

    矩阵的又一个新使用方法,构造矩阵进行高速幂. 比方拿 nyoj299 Matrix Power Series 来说 给出这样一个递推式: S = A + A2 + A3 + - + Ak. 让你求s. ...

随机推荐

  1. 13. Vue CLI脚手架

    一. Vue CLI 介绍 1. 什么是Vue CLI? Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.Vue CLI 致力于将 Vue 生态中的工具基础标准化.它确保了各种构建工 ...

  2. java 基础语法学习

    kuangstudy 注释 单行注释 多行注释 文档注释 public class HelloWorld { public static void main(String[] args) { //单行 ...

  3. 【知识点】 C++寄存器优化

    作者:李春港 出处:https://www.cnblogs.com/lcgbk/p/14502076.html 目录 一.前言 二.代码实例 三.volatile作用 一.前言 在c++中什么情况下, ...

  4. [MongoDB知识体系] 一文全面总结MongoDB知识体系

    MongoDB教程 - Mongo知识体系详解 本系列将给大家构建MongoDB全局知识体系.@pdai MongoDB教程 - Mongo知识体系详解 知识体系 学习要点 学习资料 官网资料 入门系 ...

  5. java实现回溯算法

    最近有在leetcode上面做算法题,已经遇到了两道回溯算法的题目,感觉一点思路都没有,现决定将java如何实现回溯算法做一次总结. 什么叫做回溯算法 (摘抄于百度百科) 回溯算法实际上一个类似枚举的 ...

  6. Raft共识算法详解

    Raft共识算法 一.背景 拜占庭将军问题是分布式领域最复杂.最严格的容错模型.但在日常工作中使用的分布式系统面对的问题不会那么复杂,更多的是计算机故障挂掉了,或者网络通信问题而没法传递信息,这种情况 ...

  7. python--requests模块详解

    GET请求 首先构造一个最简单的get请求,请求的链接为http://httpbin.org/get import requests 2 r = requests.get("http://h ...

  8. validator库参数校验

    目录 validator库参数校验若干实用技巧 基本示例 翻译校验错误提示信息 自定义错误提示信息的字段名 自定义结构体校验方法 自定义字段校验方法 自定义翻译方法 validator库参数校验若干实 ...

  9. Typora常用编辑方法-一个能将写博客变作享受的工具

    1,标题 ctrl+数字(1~5) 2,序号 数字序号 数字 + . +空格,之后回车换行会自动产生数字序号 非数字序号 有三种 实心圆 ,非实心圆与实心方框 都是 +空格 ,之后按tab键向内缩进, ...

  10. 力扣 - 347. 前 K 个高频元素

    目录 题目 思路1(哈希表与排序) 代码 复杂度分析 思路2(建堆) 代码 复杂度分析 题目 347. 前 K 个高频元素 思路1(哈希表与排序) 先用哈希表记录所有的值出现的次数 然后将按照出现的次 ...