POJ 2396 Budget ——有上下界的网络流
给定矩阵的每行每列的和,和一些大于小于等于的限制。然后需要求出一组可行解。
上下界网络流。
大概的思想就是计算出每一个点他需要强行流入或者流出的量,然后建出超级源点和汇点,然后删除下界,就可以判断是否可行。
然后把新的上界作为限制,在原图中跑一边。
然后就是必须的+原图中的进行计算。
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
int up[205][205],down[205][205],tt,n,m,row[205];
#define inf 0x3f3f3f3f
#define maxn 50005
int ttt,clu[205],S=maxn-4,T=maxn-3,SS=maxn-2,TT=maxn-1;
int fr[maxn],h[maxn],to[maxn],ne[maxn],fl[maxn],en=0,ans,a[205][205];
int du[maxn],id[205][205],tot,Sum,s,t,ban[maxn],SSum,SSSum; void add(int a,int b,int c)
{
fr[en]=a;to[en]=b;ne[en]=h[a];fl[en]=c;h[a]=en++;
fr[en]=b;to[en]=a;ne[en]=h[b];fl[en]=0;h[b]=en++;
} int dis[maxn];
queue<int>q; bool tell()
{
memset(dis,-1,sizeof dis); dis[s]=0; q.push(s);
while (!q.empty())
{
int x=q.front();q.pop();
for (int i=h[x];i>=0;i=ne[i])
if (dis[to[i]]==-1&&fl[i]>0&&!ban[i])
dis[to[i]]=dis[x]+1,q.push(to[i]);
}
return dis[t]!=-1;
} int zeng(int k,int now)
{
int ret=0;
if (k==t) return now;
for (int i=h[k];i>=0&&now>ret;i=ne[i])
if (dis[to[i]]==dis[k]+1&&fl[i]&&!ban[i]){
int tmp=zeng(to[i],min(fl[i],now-ret));
fl[i]-=tmp; fl[i^1]+=tmp; ret+=tmp;
}
if (!ret) dis[k]=-1;
return ret;
} int dinic(int S,int T)
{
int ret=0,tmp=0;//printf("dinic %d %d\n",S,T);
s=S;t=T;
while (tell()) while (tmp=zeng(s,inf)) ret+=tmp;
return ret;
} void build()
{
en=0;memset(h,-1,sizeof h);memset(a,0,sizeof a);
memset(du,0,sizeof du);
memset(ban,0,sizeof ban);Sum=0;
tot=0;
F(i,1,n) F(j,1,m)
{
if (up[i][j]<down[i][j]) {ans=0;return;}
du[i]-=down[i][j];
du[j+n]+=down[i][j];
up[i][j]-=down[i][j];
a[i][j]+=down[i][j];
add(i,j+n,up[i][j]);
}
F(i,1,n) add(S,i,row[i]);
F(j,n+1,n+m) add(j,T,clu[j-n]);
add(T,S,inf);
F(i,1,n+m)
{
if (du[i]>0) add(SS,i,du[i]),Sum+=du[i];
else if (du[i]<0) add(i,TT,-du[i]);
}
if (dinic(SS,TT)!=Sum) {ans=0;return;}
else
{
ban[en-1]=1;ban[en-2]=1;
for (int i=h[SS];i>=0;i=ne[i]) ban[i]=ban[i^1]=1;
for (int i=h[TT];i>=0;i=ne[i]) ban[i]=ban[i^1]=1;
if (dinic(S,T)!=SSum) {ans=0;return;}
F(i,1,n)
{
for (int j=h[i];j>=0;j=ne[j])
a[i][to[j]-n]+=fl[j^1];
}
ans=1; return;
}
} int main()
{
scanf("%d",&tt);
while (tt--)
{
memset(down,0,sizeof down);
memset(up,0x3f,sizeof up);
scanf("%d%d",&n,&m);SSum=SSSum=0;
F(i,1,n) scanf("%d",&row[i]),SSum+=row[i];
F(i,1,m) scanf("%d",&clu[i]),SSSum+=clu[i];
scanf("%d",&ttt);
F(i,1,ttt)
{
int x,y,z;char s[11];
scanf("%d%d%s%d",&x,&y,s,&z);
switch(s[0])
{
case '>':
if (!x) F(i,1,n)
{
if (!y) F(j,1,m)
down[i][j]=max(down[i][j],z+1);
else
down[i][y]=max(down[i][y],z+1);
}
else
{
if (!y) F(j,1,m)
down[x][j]=max(down[x][j],z+1);
else
down[x][y]=max(down[x][y],z+1);
}
break;
case '=':
if (!x) F(i,1,n)
{
if (!y) F(j,1,m)
{
up[i][j]=min(up[i][j],z);
down[i][j]=max(down[i][j],z);
}
else
{
up[i][y]=min(up[i][y],z);
down[i][y]=max(down[i][y],z);
}
}
else
{
if (!y) F(j,1,m)
{
up[x][j]=min(up[x][j],z);
down[x][j]=max(down[x][j],z);
}
else
{
up[x][y]=min(up[x][y],z);
down[x][y]=max(down[x][y],z);
}
}
break;
case '<':
if (!x) F(i,1,n)
{
if (!y) F(j,1,m)
up[i][j]=min(up[i][j],z-1);
else
up[i][y]=min(up[i][y],z-1);
}
else
{
if (!y) F(j,1,m)
up[x][j]=min(up[x][j],z-1);
else
up[x][y]=min(up[x][y],z-1);
}
break;
}
}
build();
if ((!ans)||(SSum!=SSSum)) printf("IMPOSSIBLE\n");
else
{
F(i,1,n) F(j,1,m)
printf("%d%c",a[i][j],j==m?'\n':' ');
}
if (tt!=0)
printf("\n");
}
}
POJ 2396 Budget ——有上下界的网络流的更多相关文章
- POJ 2396 Budget 有上下界的网络流
POJ 2396 Budget 题意简述:给定矩阵(每个元素都是非负整数)各行各列的和,并且限制其中的某些元素,给出一个可行解,特殊评测.矩阵规模小于200*20. 网络流的模型是显而易见的,不过对 ...
- poj 2396 Budget 边容量有上下界的最大流
题意: 给一个矩阵的每行和及每列和,在给一些行列或点的限制条件.求一个满足的矩阵. 分析: 转化为有上下界的网络流,注意等于也是一种上下界关系,然后用dinic算法. 代码: //poj 2396 / ...
- 【POJ2396】Budget(上下界网络流)
Description We are supposed to make a budget proposal for this multi-site competition. The budget pr ...
- ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)
//有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...
- SGU 194. Reactor Cooling(无源汇有上下界的网络流)
时间限制:0.5s 空间限制:6M 题意: 显然就是求一个无源汇有上下界的网络流的可行流的问题 Solution: 没什么好说的,直接判定可行流,输出就好了 code /* 无汇源有上下界的网络流 * ...
- 【ZOJ2314】Reactor Cooling(有上下界的网络流)
前言 话说有上下界的网络流好像全机房就我一个人会手动滑稽,当然这是不可能的 Solution 其实这道题目就是一道板子题,主要讲解一下怎么做无源无汇的上下界最大流: 算法步骤 1.将每条边转换成0~u ...
- ZOJ 2314 有上下界的网络流
problemCode=2314">点击打开链接 题意:给定m条边和n个节点.每条边最少的流量和最多的流量.保证每一个节点的出入流量和相等,问能够形成吗,能够则输出每条边的流量 思路: ...
- poj_2396 有上下界的网络流
题目大意 一个mxn的矩阵,给出矩阵中每一行的和sh[1,2...m]以及每一列的数字的和目sv[1,2...n],以及矩阵中的一些元素的范围限制,比如a[1][2] > 1, a[2][3] ...
- 【BZOJ2502】清理雪道 有上下界的网络流 最小流
[BZOJ2502]清理雪道 Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降 ...
随机推荐
- 阿里云栖社区dubbo 资源整理
1.apache dubbo pdf git 地址:https://github.com/dubbo/awesome-dubbo/tree/master/slides/meetup/201905%40 ...
- 浏览器对DIV+CSS兼容性问题大总结
浏览器对DIV+CSS兼容性问题大总结 接触DIV+CSS架构已经快两年了,个人觉得css入门不难,但要学精并非一朝一夕的,现在大部分网络公司都比较主张用div+css来布局,这就面临着一个比较难的问 ...
- COGS 2082. Asm.Def谈笑风生
★ 输入文件:asm_talk.in 输出文件:asm_talk.out 简单对比时间限制:2 s 内存限制:256 MB [题目描述] “人呐都不知道,自己不可以预料,直升机刚一出圣 ...
- (一)SpringMVC之警告: No mapping found for HTTP request with URI
这个警告往往是因为url路径不正确. 所以从三个地方下手: 1.springmvc-config.xml中的配置handle,看看是不是因为handle没有配置导致的. 2.如果是使用注解的方式的话, ...
- x-shell配置远程连接
1. 打开x-shell 2. 配置编译属性 3. 配置用户的身份证信息 5. 配置完成之后选择连接
- Codeforces Round #318 (Div. 2) D Bear and Blocks (数学)
不难发现在一次操作以后,hi=min(hi-1,hi-1,hi+1),迭代这个式子得到k次操作以后hi=min(hi-j-(k-j),hi-k,hi+j-(k-j)),j = 1,2,3... 当k ...
- build.sbt的定义格式
一个简单的build.sbt文件内容如下: name := "hello" // 项目名称 organization := "xxx.xxx.xxx" // 组 ...
- go语音实战读后感——一
1.第一个go程序: package main import ( "fmt" ) func main() { fmt.Println("Hello go") } ...
- PAT (Basic Level) Practise (中文)-1033. 旧键盘打字(20)
PAT (Basic Level) Practise (中文)-1033. 旧键盘打字(20) http://www.patest.cn/contests/pat-b-practise/1033 旧 ...
- ios之自定义UISwitch
系统自带的UISwitch是这样的: 既不能写字,也不能改颜色,于是在网上找到了这么一个自定义的Switch按钮,具体出处找不见了.记录一下,怕以后找不见了. 先看下效果图: 按钮的样式很多,可以文字 ...