第一步:建立无源汇有上下界的网络模型 每行 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【有上下界的网络流】的更多相关文章

  1. POJ 2396 Budget 有上下界的网络流

    POJ 2396  Budget 题意简述:给定矩阵(每个元素都是非负整数)各行各列的和,并且限制其中的某些元素,给出一个可行解,特殊评测.矩阵规模小于200*20. 网络流的模型是显而易见的,不过对 ...

  2. POJ 2396 Budget ——有上下界的网络流

    给定矩阵的每行每列的和,和一些大于小于等于的限制.然后需要求出一组可行解. 上下界网络流. 大概的思想就是计算出每一个点他需要强行流入或者流出的量,然后建出超级源点和汇点,然后删除下界,就可以判断是否 ...

  3. poj 2396 Budget 边容量有上下界的最大流

    题意: 给一个矩阵的每行和及每列和,在给一些行列或点的限制条件.求一个满足的矩阵. 分析: 转化为有上下界的网络流,注意等于也是一种上下界关系,然后用dinic算法. 代码: //poj 2396 / ...

  4. 【POJ2396】Budget(上下界网络流)

    Description We are supposed to make a budget proposal for this multi-site competition. The budget pr ...

  5. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

  6. SGU 194. Reactor Cooling(无源汇有上下界的网络流)

    时间限制:0.5s 空间限制:6M 题意: 显然就是求一个无源汇有上下界的网络流的可行流的问题 Solution: 没什么好说的,直接判定可行流,输出就好了 code /* 无汇源有上下界的网络流 * ...

  7. 【ZOJ2314】Reactor Cooling(有上下界的网络流)

    前言 话说有上下界的网络流好像全机房就我一个人会手动滑稽,当然这是不可能的 Solution 其实这道题目就是一道板子题,主要讲解一下怎么做无源无汇的上下界最大流: 算法步骤 1.将每条边转换成0~u ...

  8. ZOJ 2314 有上下界的网络流

    problemCode=2314">点击打开链接 题意:给定m条边和n个节点.每条边最少的流量和最多的流量.保证每一个节点的出入流量和相等,问能够形成吗,能够则输出每条边的流量 思路: ...

  9. poj_2396 有上下界的网络流

    题目大意 一个mxn的矩阵,给出矩阵中每一行的和sh[1,2...m]以及每一列的数字的和目sv[1,2...n],以及矩阵中的一些元素的范围限制,比如a[1][2] > 1, a[2][3] ...

  10. 【BZOJ2502】清理雪道 有上下界的网络流 最小流

    [BZOJ2502]清理雪道 Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降 ...

随机推荐

  1. Tomcat绑定具体IP

    https://blog.csdn.net/paomadeng/article/details/1826880

  2. mysql 统计数据,按照日期分组,把没有数据的日期也展示出来

    因为业务需求,要统计每天的新增用户并且要用折线图的方式展示. 如果其中有一天没有新增用户的话,这一天就是空缺的,在绘制折线图的时候是不允许的,所有要求把没有数据的日期也要在图表显示. 查询2019-0 ...

  3. Java实验——输出二维数组连续二维子数组的最大和

    该算法思路,根据我博客里面一维子数组求和的思路,可以用一个新的二维数组对该二维区域的数组进行求和,例如新的二维数组的第5个位置,就代表从1到5斜对角线的块状区域的和,即1,2,4,5这4个数的和,x个 ...

  4. Java的基本运算符

    以下内容引用自http://wiki.jikexueyuan.com/project/java/basic-operators.html: Java针对操控变量提供了一组丰富的运算符.可以将所有的Ja ...

  5. 打开input输入的时候,css中position:absolute/fixed定位的时候,定位元素上移问题解决

    1.异常代码 <style> .box{ min-height: 100vh; width: 100%; position: relative; } .position{ position ...

  6. mysql登录退出命令

    1. MySQL登录与退出登录Mysql:“输入mysql -u帐号 -p密码 这是登陆mysql退出:mysql > exit;以下是实例参考下: 登录Mysql:“输入mysql -uroo ...

  7. SharePoint中取得ACL和组中用户数量

     SharePoint中取得ACL和组中用户数量 1. 取得ACL的数量: select COUNT(ra.PrincipalId) as [Count],p.ScopeUrl from [WSS_C ...

  8. idea、jdk、eclispe中空main方法的线程数量不一样,why?

    測试代码: public class Test {     public static void main(String[] args) {         System.out.println(Th ...

  9. Phalcon 开发工具(Phalcon Developer Tools)

    Phalcon提供的这个开发工具主要是用来辅助开发,比方生成一些程序的基本框架.生成控制器模型等. 使用这个工具我们仅仅须要一个简单的命令就可以生成应用的基本框架. 很重要: 要使用这个工具我们必需要 ...

  10. JSX 语法

    jsx 不能直接运行,是被 babel-loader 中的 react 这个 preset 翻译的 需要注意: 1.必须被一个单独的大标签包裹,比如:div 或者 section 2.标签必须封闭 3 ...