poj2396 Budget 上下界可行流
Budget:http://poj.org/problem?id=2396
题意:
给定一个棋盘,给定每一行每一列的和,还有每个点的性质。求一个合理的棋盘数值放置方式。
思路:
比较经典的网络流模型,把每一列看成一个点,每一行看成一个点,利用上下界可行流的思路建图就行了,注意这里由于是严格的小于和大于,所以可以利用 x+1, x-1。
还有就是这道题的0 , 0 说的是对整张图的操作。
#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert> /* ⊂_ヽ
\\ Λ_Λ 来了老弟
\('ㅅ')
> ⌒ヽ
/ へ\
/ / \\
レ ノ ヽ_つ
/ /
/ /|
( (ヽ
| |、\
| 丿 \ ⌒)
| | ) /
'ノ ) Lノ */ using namespace std;
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue typedef long long ll;
typedef unsigned long long ull;
//typedef __int128 bll;
typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int,pii> p3; //priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl '\n' #define boost ios::sync_with_stdio(false);cin.tie(0)
#define rep(a, b, c) for(int a = (b); a <= (c); ++ a)
#define max3(a,b,c) max(max(a,b), c);
#define min3(a,b,c) min(min(a,b), c); const ll oo = 1ll<<;
const ll mos = 0x7FFFFFFF; //
const ll nmos = 0x80000000; //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f; //
const int mod = 1e9+;
const double esp = 1e-;
const double PI=acos(-1.0);
const double PHI=0.61803399; //黄金分割点
const double tPHI=0.38196601; template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} inline void cmax(int &x,int y){if(x<y)x=y;}
inline void cmax(ll &x,ll y){if(x<y)x=y;}
inline void cmin(int &x,int y){if(x>y)x=y;}
inline void cmin(ll &x,ll y){if(x>y)x=y;} /*-----------------------showtime----------------------*/ const int maxn = 1e4+;
int n,m;
struct E{
int v,val,id;
int nxt;
}edge[maxn];
int head[maxn],gtot;
void addedge(int u,int v,int val, int id){
edge[gtot].v = v;
edge[gtot].val = val;
edge[gtot].nxt = head[u];
edge[gtot].id = -;
head[u] = gtot++; edge[gtot].v = u;
edge[gtot].val = ;
edge[gtot].nxt = head[v];
edge[gtot].id = id;
head[v] = gtot++;
} int dis[maxn],cur[maxn],all;
bool bfs(int s,int t) {
memset(dis, inf, sizeof(dis)); for(int i=; i<=all; i++) cur[i] = head[i];
queue<int>que; que.push(s);
dis[s] = ;
while(!que.empty()){
int u = que.front(); que.pop();
for(int i=head[u]; ~i; i=edge[i].nxt){
int v = edge[i].v,val = edge[i].val;
if(val > && dis[v] > dis[u] + ){
dis[v] = dis[u]+ ;
que.push(v);
}
}
}
return dis[t] < inf;
}
int dfs(int u,int t,int maxflow){
if(u == t || maxflow == ) return maxflow;
for(int i=cur[u]; ~i; i=edge[i].nxt){
cur[u] = i;
int v=edge[i].v,val = edge[i].val;
if(val > &&dis[v] == dis[u] + ){
int f = dfs(v, t, min(maxflow, val));
if(f > ) {
edge[i].val -= f;
edge[i ^ ].val += f;
return f;
}
}
}
return ;
}
int dinic(int s,int t){
int flow = ;
while(bfs(s, t)){
while(int f = dfs(s, t, inf)) flow += f;
}
return flow;
} int low[][],high[][],du[];
char op[];
int main(){
int T;
scanf("%d", &T);
while(T--){
memset(head, -, sizeof(head));
memset(low, , sizeof(low));
memset(high, inf, sizeof(high));
memset(du, , sizeof(du));
gtot = ;
scanf("%d%d", &n, &m);
int s = , t = n+m+, ss = n+m+, tt = n+m+;
all = tt;
int s1 = , s2 = ;
for(int i=; i<=n; i++) {
int x; scanf("%d", &x);
addedge(s, i, , -);
du[s] -= x;
du[i] += x;
s1 += x;
}
for(int i=; i<=m; i++){
int x; scanf("%d", &x);
addedge(n+i, t, , -);
du[t] += x;
du[n+i] -= x;
s2 += x;
} int c; scanf("%d", &c);
int flag = ;
while(c--){
int u,v,x;
scanf("%d %d %s %d", &u, &v, op, &x);
if(u == && v == ){
for(int i=; i<=n; i++) {
for(int j=; j<=m; j++){
if(op[] == '>') low[i][j] = max(low[i][j],x+);
else if(op[] == '<') high[i][j] = min(high[i][j], x-);
else if(op[] == '=')
{
low[i][j] = max(low[i][j], x), high[i][j] = min(high[i][j], x);
if(low[i][j] != x || high[i][j] != x) flag = ;
}
}
}
}
else if(u == ) {
for(int i=; i<=n; i++) {
if(op[] == '>') low[i][v] = max(low[i][v],x+);
else if(op[] == '<') high[i][v] = min(high[i][v], x-);
else if(op[] == '=')
{
low[i][v] = max(low[i][v], x), high[i][v] = min(high[i][v], x);
if(low[i][v] != x || high[i][v] != x) flag = ;
}
}
}
else if(v == ){
for(int i=; i<=m; i++) {
if(op[] == '>') low[u][i] = max(low[u][i],x+);
else if(op[] == '<') high[u][i] = min(high[u][i], x-);
else {
low[u][i] = max(low[u][i], x), high[u][i] = min(high[u][i], x);
if(low[u][i] != x || high[u][i] != x) flag = ;
}
}
}
else {
if(op[] == '>') low[u][v] = max(low[u][v],x+);
else if(op[] == '<') high[u][v] = min(high[u][v], x-);
else {
low[u][v] = max(low[u][v], x), high[u][v] = min(high[u][v], x);
if(low[u][v] != x || high[u][v] != x) flag = ;
}
}
} for(int i=; i<=n; i++) {
for(int j=; j<=m; j++){
du[i] -= low[i][j];
du[j+n] += low[i][j];
addedge(i, n + j, high[i][j] - low[i][j], );
if(high[i][j] < low[i][j]) flag = ;
}
} int sum = ;
for(int i=s; i<=t; i++) {
if(du[i] > ) addedge(ss, i, du[i], -), sum += du[i];
if(du[i] < )addedge(i, tt, -du[i], -);
}
if(s1 != s2 || !flag) {
puts("IMPOSSIBLE");
if(T) puts("");
continue;
}
int f = dinic(ss, tt); if(f + s1==sum) {
for(int i=n+;i<=n+m; i++){
for(int j=head[i]; ~j; j=edge[j].nxt){
int v = edge[j].v,val = edge[j].val;
low[v][i-n] += val;
}
}
for(int i=; i<=n; i++){
for(int j=; j<=m; j++){
if(j < m)printf("%d ", low[i][j]);
else printf("%d\n", low[i][j]);
}
}
}
else puts("IMPOSSIBLE");
if(T) puts("");
}
return ;
}
/*
2
2 3
8 10
5 6 7
4
0 2 > 2
2 1 = 3
2 3 > 2
2 3 < 5
2 2
4 5
6 7
1
1 1 > 10
*/
poj2396 Budget 上下界可行流的更多相关文章
- [poj2396]Buget[上下界可行流]
题意:有一个n*m的方阵,里面的数字未知,但是我们知道如下约束条件:每一行的数字的和每一列的数字的和某些格子有特殊的大小约束,用大于号,小于号和等于号表示问:是否存在用正数填充这个方阵的方案,满足所有 ...
- POJ2396 Budget [有源汇上下界可行流]
POJ2396 Budget 题意:n*m的非负整数矩阵,给出每行每列的和,以及一些约束关系x,y,>=<,val,表示格子(x,y)的值与val的关系,0代表整行/列都有这个关系,求判断 ...
- poj2396 Budget(有源汇上下界可行流)
[题目链接] http://poj.org/problem?id=2396 [题意] 知道一个矩阵的行列和,且知道一些格子的限制条件,问一个可行的方案. [思路] 设行为X点,列为Y点,构图:连边(s ...
- 有源汇上下界可行流(POJ2396)
题意:给出一个n*m的矩阵的每行和及每列和,还有一些格子的限制,求一组合法方案. 源点向行,汇点向列,连一条上下界均为和的边. 对于某格的限制,从它所在行向所在列连其上下界的边. 求有源汇上下界可行流 ...
- [poj] 2396 [zoj] 1994 budget || 有源汇的上下界可行流
poj原题 zoj原题 //注意zoj最后一行不要多输出空行 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表不同赛区支出的矩阵.组委会曾经开会讨论过各类支出的总和,以及各赛区 ...
- poj2396有源汇上下界可行流
题意:给一些约束条件,要求算能否有可行流,ps:刚开始输入的是每一列和,那么就建一条上下界相同的边,这样满流的时候就一定能保证流量相同了,还有0是该列(行)对另一行每个点都要满足约束条件 解法:先按无 ...
- ZOJ_2314_Reactor Cooling_有上下界可行流模板
ZOJ_2314_Reactor Cooling_有上下界可行流模板 The terrorist group leaded by a well known international terroris ...
- ZOJ1994有源汇上下界可行流
http://fastvj.rainng.com/contest/236779#problem/G Description: n 行 m 列 给你行和 与 列和 然后有Q个限制,表示特定单元格元素大小 ...
- LOJ [#115. 无源汇有上下界可行流](https://loj.ac/problem/115)
#115. 无源汇有上下界可行流 先扔个板子,上下界的东西一点点搞,写在奇怪的合集里面 Code: #include <cstdio> #include <cstring> # ...
随机推荐
- 基于SpringBoot从零构建博客网站 - 新增创建、修改、删除专栏功能
守望博客是支持创建专栏的功能,即可以将一系列相关的文章归档到专栏中,方便用户管理和查阅文章.这里主要讲解专栏的创建.修改和删除功能,至于专栏还涉及其它的功能,例如关注专栏等后续会穿插着介绍. 1.创建 ...
- Presto Event Listener开发
简介 同Hive Hook一样,Presto也支持自定义实现Event Listener,用于侦听Presto引擎执行查询时发生的事件,并作出相应的处理.我们可以利用该功能实现诸如自定义日志记录.调试 ...
- Hack The Box Web Pentest 2019
[20 Points] Emdee five for life [by L4mpje] 问题描述: Can you encrypt fast enough? 初始页面,不管怎么样点击Submit都会显 ...
- Charles PC端和手机端抓取HTTP和HTTPS协议请求、HTTPS通用抓包规则
一:HTTP和HTTPS的区别 HTTP是超文本传输协议,被用在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,因此HTTP协议不适合传输一些敏感信息, ...
- PID算法通俗理解,平衡车,倒立摆,适合不理解PID算法的人来看!
先插句广告,本人QQ522414928,不熟悉PID算法的可以一起交流学习,随时在线(PID资料再我的另一篇博客里) 倒立摆资料连接↓ https://www.cnblogs.com/LiuXinyu ...
- 【OpenCV-ANN神经网络自动驾驶】树莓派OpenCV神经网络自动驾驶小车【源码+实物】
没错!这个是我的毕业设计!!! 整个电子信息学院唯一一个优秀毕业设计 拿到这里炫耀了 实物如下: 电脑端显示效果: 自动驾驶实现过程: 1. 收集图像数据.建立局域网,让主机和Raspberry Pi ...
- redis分布式锁&队列应用
分布式锁 setnx(set if not exists) 如果设值成功则证明上锁成功,然后再调用del指令释放. // 这里的冒号:就是一个普通的字符,没特别含义,它可以是任意其它字符,不要误解 & ...
- gitee+hexo搭建个人博客
通过gitee和hexo搭建个人博客 首先准备软件: git (提供命令git) git官网 notepad++(方便编辑)notepad++官网 nodejs(hexo依赖)nodejs官网 7z( ...
- ajax具体实现学习记录
记录自己对ajax\的理解, 首先要明白ajax是为了解决什么问题,简单来讲就是为了局部刷新页面,而不刷新整个界面.就比如现在有一个实时热度的显示,它是不断变化的,所以你肯定要不停的从数据库当中获取热 ...
- Hyper-V虚拟机上安装Ubuntu16.04/Ubuntu18.04.2LTS,搭建GitLab
我的电脑系统是win10,内存8g如下 一开始是装的Ubuntu18.04.2LTS, gitlab-ce_12.1.3-ce.0_amd64.deb,每次能够安装成功,但是修改完ip后,运行gitl ...