poj 2396 Budget【有上下界的网络流】
第一步:建立无源汇有上下界的网络模型 每行 i 作为一个点并连边(s, i, Ri, Ri),每列 j 作为一个点并连边(j, t, Cj, Cj),设 Uij, Lij 分别表示第 i 行第 j 列元素的上下界,初始时设 Uij=∞, Lij=0。按照给定的约束条 件不断调整 Uij, Lij,若出现 Lij > Uij 的情况则已经不存在合法解。对所有元素加 边(i, j, Lij, Uij)。另添加边(t, s, 0, ∞)消去原网络的源汇。
第二步:转化为最大流模型 新建源 s’和汇 t’,对每条下界大于 0 的边(i, j, Lij, Uij),加边(i, t’, 0, Lij), (s’, j, 0, Lij)。 若新网络中最大流等于所有下界之和,则原网络存在可行流,即存在满足所有约 束条件的矩阵。
————BY Edelweiss 《 网络流建模汇总》
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=2000005,inf=1e9;
int n,m,q,h[N],cnt=1,le[N],s,t,S,T,sum,lm[2][205][205],fr[505][55];
bool flg;
char c[10];
struct qwe
{
int ne,no,to,va;
}e[N];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(int u,int v,int w)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].no=u;
e[cnt].to=v;
e[cnt].va=w;
h[u]=cnt;
}
void ins(int u,int v,int w)
{
if(!w)
return;
if(u==S)
sum+=w;
add(u,v,w);
add(v,u,0);
}
void jiabian(int u,int v,int l,int r)
{
if(r<l)
{
flg=0;
return;
}
ins(S,v,l);
ins(u,T,l);
ins(u,v,r-l);
}
bool bfs()
{
queue<int>q;
memset(le,0,sizeof(le));
le[S]=1;
q.push(S);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=h[u];i;i=e[i].ne)
if(e[i].va>0&&!le[e[i].to])
{
le[e[i].to]=le[u]+1;
q.push(e[i].to);
}
}
return le[T];
}
int dfs(int u,int f)
{
if(!f||u==T)
return f;
int us=0;
for(int i=h[u];i&&us<f;i=e[i].ne)
if(e[i].va>0&&le[e[i].to]==le[u]+1)
{
int t=dfs(e[i].to,min(e[i].va,f-us));
e[i].va-=t;
e[i^1].va+=t;
us+=t;
}
if(!us)
le[u]=0;
return us;
}
int dinic()
{
int re=0;
while(bfs())
re+=dfs(S,inf);
memset(fr,0,sizeof(fr));//cout<<re<<" "<<sum<<endl;
if(re==sum)
{//cout<<"ok"<<endl;
for(int i=1;i<=cnt;i+=2)
if(e[i].no>n&&e[i].no<=n+m&&e[i].to<=n+m)
fr[e[i].to][e[i].no-n]=e[i].va;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%d ",fr[i][j]+lm[0][i][j]);
puts("");
}
puts("");
}
else
puts("IMPOSSIBLE\n");
}
int main()
{
int cas=read();
while(cas--)
{
n=read(),m=read();
memset(h,0,sizeof(h));
cnt=1,flg=1,sum=0;
s=n+m+1,t=s+1,S=t+1,T=S+1;
for(int i=1;i<=n;i++)
{
int x=read();
jiabian(s,i,x,x);
}
for(int i=1;i<=m;i++)
{
int x=read();
jiabian(i+n,t,x,x);
}
q=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
lm[0][i][j]=0;
lm[1][i][j]=inf;
}
while(q--)
{
int x=read(),y=read();
scanf("%s",c);
int z=read(),k1,k2,k3,k4;
if(x==0)
k1=1,k2=n;
else
k1=k2=x;
if(y==0)
k3=1,k4=m;
else
k3=k4=y;
for(int i=k1;i<=k2;i++)
for(int j=k3;j<=k4;j++)
{
if(c[0]=='>')
lm[0][i][j]=max(lm[0][i][j],z+1);
if(c[0]=='=')
lm[0][i][j]=max(lm[0][i][j],z);
if(c[0]=='<')
lm[1][i][j]=min(lm[1][i][j],z-1);
if(c[0]=='=')
lm[1][i][j]=min(lm[1][i][j],z);
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
jiabian(i,j+n,lm[0][i][j],lm[1][i][j]);
if(flg==0)
break;
}
jiabian(t,s,0,inf);
if(!flg)
puts("IMPOSSIBLE\n");
else
dinic();
}
return 0;
}
poj 2396 Budget【有上下界的网络流】的更多相关文章
- POJ 2396 Budget 有上下界的网络流
POJ 2396 Budget 题意简述:给定矩阵(每个元素都是非负整数)各行各列的和,并且限制其中的某些元素,给出一个可行解,特殊评测.矩阵规模小于200*20. 网络流的模型是显而易见的,不过对 ...
- POJ 2396 Budget ——有上下界的网络流
给定矩阵的每行每列的和,和一些大于小于等于的限制.然后需要求出一组可行解. 上下界网络流. 大概的思想就是计算出每一个点他需要强行流入或者流出的量,然后建出超级源点和汇点,然后删除下界,就可以判断是否 ...
- 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省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降 ...
随机推荐
- 并发编程——IO模型
前言 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义, ...
- 用Google Analytics UTM标注社会化媒体分享流量来源
随着社会化媒体营销概念近两年的日益盛行,敢于吃螃蟹的营销工作者们展开了一些尝试,发现对社会化营销效果进行综合评估是一大难点,价值难以衡量.主要原因在于它的营销效果中混杂了直接的目标转化.品牌宣传.品牌 ...
- POJ 3666 Making the Grade【DP】
读题堪忧啊,敲完了才发现理解错了..理解题必须看样例啊!! 题目链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110495#pro ...
- 最少拦截系统-----hdu1257(dp+最长上升子序列)
Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高 ...
- hdu6215 Brute Force Sorting(模拟)
题意 给一个长度为n(n<=1e5)的序列,如果一个位置i满足a[i-1]>a[i]或者a[i]>a[i+1],那么我们就称该位置是不合法的位置 先把序列中所有不合法的位置统一找出来 ...
- ORA-01034: ORACLE not available 出错
调用db.rlogon("sm/sm")出现以下错误 ORA-01034: ORACLE not availableORA-27101: shared memory realm d ...
- curl post请求方式
curl -l -H "application/x-www-form-urlencoded; charset=UTF-8" -X POST -d "query=SELEC ...
- Arcgis栅格时序地图制作---时间轴动态展示多期影像
转自原文 Arcgis栅格时序地图制作---时间轴动态展示多期影像 效果如何???满意您go on,不满意咱 say goodbye··· 题外话: 为了在这里动态展示下制作结果,也是费了老劲了,转换 ...
- ArcEngine读取ShapeFile时,出现乱码的解决方案
ArcEngine读取ShapeFile时,如果用LicenseControl的话,字段中含有汉字时可以正常使用,当使用LicenseInitializer进行初始化时,读取含有汉字的字段时,就会出现 ...
- 集群FULL GC导致服务不可用
FULL GC会导致stop-the-world,频繁的FULL GC会影响系统的可用性.stackoverflow上有个提问是这么描述这个问题的:当服务器集群批量启动后,执行FULL GC的频率和时 ...