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

解法:先按无源汇上下界可行流建边,然后添加一条从t到s的容量为inf的边,从超级源到超级汇跑一边最大流,看流量是不是等于新加边的流量和,注意这题有可能输入的数据会有锚段,那么我们需要特判一下是否有矛盾出现

还要注意的一点是:我刚开始是用string+cin读入的字符,但是出现了问题,导致我代码下面的那组数据不能运行,改成scanf却能运行了,为什么单个字符就不能用string读入呢,还是说有其他的格式问题?

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f; struct edge{
int from,to,Next,c,low;
}e[maxn<<];
int cnt,head[N];
int in[N],out[N];
int dis[N];
int minn[N][N],maxx[N][N];
void add(int u,int v,int c,int low)
{
// cout<<u<<" "<<v<<" "<<c<<" "<<low<<endl;
out[u]+=low;
in[v]+=low;
e[cnt].from=u;
e[cnt].to=v;
e[cnt].c=c;
e[cnt].low=low;
e[cnt].Next=head[u];
head[u]=cnt++;
e[cnt].from=v;
e[cnt].to=u;
e[cnt].c=;
e[cnt].low=low;
e[cnt].Next=head[v];
head[v]=cnt++;
}
void init(int n,int m)
{
cnt=;
memset(head,-,sizeof head);
memset(in,,sizeof in);
memset(out,,sizeof out);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
minn[i][j]=,maxx[i][j]=inf;
}
bool bfs(int s,int t)
{
memset(dis,-,sizeof dis);
dis[s]=;
queue<int>q;
q.push(s);
while(!q.empty())
{
int x=q.front();
q.pop();
if(x==t)return ;
for(int i=head[x];~i;i=e[i].Next)
{
int te=e[i].to;
if(dis[te]==-&&e[i].c>)
{
dis[te]=dis[x]+;
q.push(te);
}
}
}
return ;
}
int dfs(int x,int mx,int t)
{
if(x==t)return mx;
int flow=;
for(int i=head[x];~i;i=e[i].Next)
{
int te=e[i].to,f;
if(dis[te]==dis[x]+&&e[i].c>&&(f=dfs(te,min(mx-flow,e[i].c),t)))
{
e[i].c-=f;
e[i^].c+=f;
flow+=f;
}
}
if(!flow)dis[x]=-;
return flow;
}
int maxflow(int s,int t)
{
int ans=,f;
while(bfs(s,t))
{
while((f=dfs(s,inf,t)))ans+=f;
}
return ans;
}
int main()
{
/* ios::sync_with_stdio(false);
cin.tie(0);*/
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
init(n,m);
int s=n+m+,t=n+m+,sum1=,sum2=;
bool can=;
for(int i=;i<=n;i++)
{
int a;
scanf("%d",&a);
sum1+=a;
add(s,i,,a);
if(a<)can=;
}
for(int i=;i<=m;i++)
{
int a;
scanf("%d",&a);
sum2+=a;
add(i+n,t,,a);
if(a<)can=;
}
int res;
scanf("%d",&res);
while(res--)
{
int a,b,c;char str;
scanf("%d %d %c %d",&a,&b,&str,&c);
if(str=='<'&&c<)can=;
if(str=='=')
{
if(a==&&b==)
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
minn[i][j]=max(minn[i][j],c);
maxx[i][j]=min(maxx[i][j],c);
}
}
else if(a!=&&b==)
{
for(int j=;j<=m;j++)
{
minn[a][j]=max(minn[a][j],c);
maxx[a][j]=min(maxx[a][j],c);
}
}
else if(a==&&b!=)
{
for(int i=;i<=n;i++)
{
minn[i][b]=max(minn[i][b],c);
maxx[i][b]=min(maxx[i][b],c);
}
}
else if(a!=&&b!=)
{
minn[a][b]=max(minn[a][b],c);
maxx[a][b]=min(maxx[a][b],c);
}
}
else if(str=='>')
{
if(a==&&b==)
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
minn[i][j]=max(minn[i][j],c+);
}
}
else if(a!=&&b==)
{
for(int j=;j<=m;j++)
{
minn[a][j]=max(minn[a][j],c+);
}
}
else if(a==&&b!=)
{
for(int i=;i<=n;i++)
{
minn[i][b]=max(minn[i][b],c+);
}
}
else if(a!=&&b!=)
{
minn[a][b]=max(minn[a][b],c+);
}
}
else
{
if(a==&&b==)
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
maxx[i][j]=min(maxx[i][j],c-);
}
}
else if(a!=&&b==)
{
for(int j=;j<=m;j++)
{
maxx[a][j]=min(maxx[a][j],c-);
}
}
else if(a==&&b!=)
{
for(int i=;i<=n;i++)
{
maxx[i][b]=min(maxx[i][b],c-);
}
}
else if(a!=&&b!=)
{
maxx[a][b]=min(maxx[a][b],c-);
}
}
}
int be=cnt;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
// cout<<maxx[i][j]<<" "<<minn[i][j]<<endl;
if(maxx[i][j]<minn[i][j])can=;
add(i,j+n,maxx[i][j]-minn[i][j],minn[i][j]);
}
}
int en=cnt-;
add(t,s,inf,);
int ss=n+m+,tt=n+m+,sum3=;
for(int i=;i<=n+m+;i++)
{
if(in[i]>out[i])add(ss,i,in[i]-out[i],),sum3+=in[i]-out[i];
else add(i,tt,out[i]-in[i],);
}
if(sum1!=sum2||!can||sum3!=maxflow(ss,tt))puts("IMPOSSIBLE");
else
{
can=;
for(int i=be;i<=en;i+=)
{
if(e[i^].c+e[i].low<)
{
can=;
break;
}
}
if(can==)puts("IMPOSSIBLE");
else
{
int co=;
for(int i=be;i<=en;i+=)
{
printf("%d",e[i^].c+e[i].low);
co++;
if(co!=m)printf("%c",' ');
else puts(""),co=;
}
}
}
puts("");
}
return ;
}
/********************
179 20
10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000
89500 89500 89500 89500 89500 89500 89500 89500 89500 89500 89500 89500 89500 89500 89500 89500 89500 89500 89500 89500
5
130 0 > 307
0 0 < 366
0 0 > 329
0 0 < 341
0 0 < 324
********************/

poj2396有源汇上下界可行流的更多相关文章

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

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

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

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

  3. 计蒜客 31447 - Fantastic Graph - [有源汇上下界可行流][2018ICPC沈阳网络预赛F题]

    题目链接:https://nanti.jisuanke.com/t/31447 "Oh, There is a bipartite graph.""Make it Fan ...

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

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

  5. 算法复习——有源汇上下界可行流(bzoj2396)

    题目: Description We are supposed to make a budget proposal for this multi-site competition. The budge ...

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

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

  7. bzoj 2406 矩阵 —— 有源汇上下界可行流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2406 这题,首先把题目那个式子的绝对值拆成两个限制,就成了网络流的上下界: 有上下界可行流原 ...

  8. bzoj千题计划158:bzoj2406: 矩阵(有源汇上下界可行流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2406 设矩阵C=A-B 最小化 C 一行或一列和的最大值 整体考虑一行或者一列的和 二分最大值 这样 ...

  9. poj2396 Budget&&ZOJ1994 Budget[有源汇上下界可行流]

    Budget Time Limit: 5 Seconds      Memory Limit: 32768 KB      Special Judge We are supposed to make ...

随机推荐

  1. camke GUI工具 选择 vs2017 时,如何指定工具集 v140 而不是默认的 v141?

    在参数位置加入 v140 即可,不需要加 -T

  2. 004-RIP、OSPF【路由选择协议】

    常见的路由选择协议有:RIP协议.OSPF协议. 1.RIP协议 路由信息协议(英语:Routing Information Protocol,缩写:RIP)是一种内部网关协议(IGP),为最早出现的 ...

  3. 006-MySQL中使用SHOW PROFILE命令分析性能

    一.概述 1.版本支持 Show profiles是5.0.37之后添加的,要想使用此功能,要确保版本在5.0.37之后. 查看数据库版本: Select version(); 2.查看开启关闭和默认 ...

  4. 解读mysql主从配置及其原理分析(Master-Slave)

    在windows下配置的,后面会在Linux下配置进行测试,需要配置mysql数据库同步的朋友可以参考下. 1.在主数据库服务器为从服务器添加一个拥有权限访问主库的用户:GRANT REPLICATI ...

  5. LSTM梳理,理解,和keras实现 (一)

    注:本文主要是在http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 这篇文章的基础上理解写成,姑且也可以称作 The understan ...

  6. notepad++运行python代码

    notepad++运行代码 在菜单栏中点击运行或按F5,在弹出的对话框中输入下面命令 cmd /k E:\py3.6\python.exe "$(FULL_CURRENT_PATH)&quo ...

  7. range基础

    collapse这个方法是把结束位置抛弃掉,并不是简单的设置到开始位置. 结束位置被抛弃掉以后,只要没有给它重新设置位置,它就一直都会等 于开始位置.即使你修改了开始位置,结束位置还是会在修改后的开始 ...

  8. git 分支合并处理

    Git 分支 - 分支的新建与合并 https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%85%B3%E4%BA%8E%E7%89%88%E6%9 ...

  9. P4340 [SHOI2016]随机序列

    题目 P4340 [SHOI2016]随机序列 思维好题 做法 是否觉得水在于你是否发现加减是会抵消的,所以我们只用考虑乘的部分 一块乘只能前面无号(也就是前缀形式)才统计,所以用线段树维护区间前缀乘 ...

  10. NAS、SAN、DAS 说明

    NAS 说明 1.NAS(Network Attached Storage:网络附属存储) 2.NAS 是一种采用直接与网络介质相连的特殊设备实现数据存储的机制. 3.NAS本身能够支持多种协议(如N ...