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 上下界可行流的更多相关文章

  1. [poj2396]Buget[上下界可行流]

    题意:有一个n*m的方阵,里面的数字未知,但是我们知道如下约束条件:每一行的数字的和每一列的数字的和某些格子有特殊的大小约束,用大于号,小于号和等于号表示问:是否存在用正数填充这个方阵的方案,满足所有 ...

  2. POJ2396 Budget [有源汇上下界可行流]

    POJ2396 Budget 题意:n*m的非负整数矩阵,给出每行每列的和,以及一些约束关系x,y,>=<,val,表示格子(x,y)的值与val的关系,0代表整行/列都有这个关系,求判断 ...

  3. poj2396 Budget(有源汇上下界可行流)

    [题目链接] http://poj.org/problem?id=2396 [题意] 知道一个矩阵的行列和,且知道一些格子的限制条件,问一个可行的方案. [思路] 设行为X点,列为Y点,构图:连边(s ...

  4. 有源汇上下界可行流(POJ2396)

    题意:给出一个n*m的矩阵的每行和及每列和,还有一些格子的限制,求一组合法方案. 源点向行,汇点向列,连一条上下界均为和的边. 对于某格的限制,从它所在行向所在列连其上下界的边. 求有源汇上下界可行流 ...

  5. [poj] 2396 [zoj] 1994 budget || 有源汇的上下界可行流

    poj原题 zoj原题 //注意zoj最后一行不要多输出空行 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表不同赛区支出的矩阵.组委会曾经开会讨论过各类支出的总和,以及各赛区 ...

  6. poj2396有源汇上下界可行流

    题意:给一些约束条件,要求算能否有可行流,ps:刚开始输入的是每一列和,那么就建一条上下界相同的边,这样满流的时候就一定能保证流量相同了,还有0是该列(行)对另一行每个点都要满足约束条件 解法:先按无 ...

  7. ZOJ_2314_Reactor Cooling_有上下界可行流模板

    ZOJ_2314_Reactor Cooling_有上下界可行流模板 The terrorist group leaded by a well known international terroris ...

  8. ZOJ1994有源汇上下界可行流

    http://fastvj.rainng.com/contest/236779#problem/G Description: n 行 m 列 给你行和 与 列和 然后有Q个限制,表示特定单元格元素大小 ...

  9. LOJ [#115. 无源汇有上下界可行流](https://loj.ac/problem/115)

    #115. 无源汇有上下界可行流 先扔个板子,上下界的东西一点点搞,写在奇怪的合集里面 Code: #include <cstdio> #include <cstring> # ...

随机推荐

  1. [解决方案]IIS配置后报错404,500,502等系列问题

    很多时候刚部署完服务器的IIS以后,第一次部署站点都会出现形形色色,各种各样的报错问题,但这些问题大同小异,我这里就给大家提供的解决的方案,以达到以不变应万变的效果 目的:让大家学会处理类似问题的方法 ...

  2. Linux命令之文件相关

    cd 绝对路径相对路径 --转到对应目录 touch-a --更新访问时间 touch -m --更新修改时间(ls -l只能显示修改时间) touch -t [[cc]yy]mmddhhmm[ss] ...

  3. 工业物联网网关在线探测之TraceRoute

    佰马工业物联网网关BMG500在线探测通常有Ping.DNS.TraceRoute三种技术方式,这三种方式的区别与联系是什么?本文着重介绍工业物联网网关在线探测的工作原理,以图文形式介绍无线网关在线探 ...

  4. 在 Windows 上使用 Python 进行 web 开发

    本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上一篇我们介绍了在Windows 10下进行初学者入门开发Python的指 ...

  5. Linux基础用户管理

    一.用户管理 (一).用户和组的基本概念 Users and groups:. Every process (running program) on the system runs as a part ...

  6. 佳木斯集训Day6

    T1还是个找规律啊,记下b的个数,然后直接*2%10000000009就好了 #include <bits/stdc++.h> #define mo 1000000007 using na ...

  7. MySQL数据库基本知识(理论总结)

    定义:数据库就是一个文件系统,通过sql语句来获取数据 关系型数据库:关系型数据库存放的是实体时间的关系,在数据库层面来看就是存放的是表和表之间的关联关系 常见的关系型数据库   MySQL    D ...

  8. 【Kubernetes 系列一】Kubernetes 概述

    以下内容还可以通过 Google Slide 查看:https://docs.google.com/presentation/d/1eYP4bkVBojI_e6PqdpxIf0hvWO-JwAf-fy ...

  9. 大厂面试Kafka,一定会问到的幂等性

    01 幂等性如此重要 Kafka作为分布式MQ,大量用于分布式系统中,如消息推送系统.业务平台系统(如结算平台),就拿结算来说,业务方作为上游把数据打到结算平台,如果一份数据被计算.处理了多次,产生的 ...

  10. Java 安全之:csrf攻击总结

    最近在维护一些老项目,调试时发现请求屡屡被拒绝,仔细看了一下项目的源码,发现有csrf token校验,借这个机会把csrf攻击学习了一下,总结成文.本文主要总结什么是csrf攻击以及有哪些方法来防范 ...