POJ 2396 Budget【网络流】
题意:
cas //测试数据组数
n m //行数 列数
a1 a2 ... an //每行的和
b1 b2 ... bn //每列的和
q //操作数量
//接下来q行
a b >/</= c //若a为0则表示一整列,b为0表示一整行,否则a代表第几行,b代表第几列,操作表示选中区域或者某个元素要严格大于或者严格小于或者等于c
求:判断是否存在合法矩阵,如果存在输出任一合法矩阵(每个元素都要求非负),否则输出“IMPOSSIBLE”
思路:
上马基的时候自己想了想,首先是各种基础的操作判断给出的各项限制之间有没有矛盾,然后最大流跑下判断。
根据给出的限制,每个元素都有下限和上限,然后把下限单独从总的流中拿出来,用剩下的区间的值跑下最大流,看最后最大流的流量是否是去除每个元素下限之后的所有的元素的和。
坑:
1.这题是多组输入数据,如果判断出不可能直接return 0;这种愚蠢的行为出现在我的代码上了。已经无力吐槽。
2.建图。一开始我的建图的方法是每个元素在图中表示一个点,然后左端是表示行的点右端是表示列的点,然后连起来。当时感觉好像还不错,保证每个点对行和列的贡献是一样的...然后就开始各种超时了,一直找原因,直到找到大神的代码...真是tmsb,其实这种点的度数为2而且两条边的容量是相等的情况下,完全可以把这点省略,去除了n*m个点就过了...
不管怎么样,有坑都是好事。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<string.h>
#include<vector>
#define MAXN 4050
#define MAXM 40050
using namespace std;
const int inf=0x3f3f3f3f;
int hang[],lie[];
int mmax[][],mmin[][];
struct Edge
{
int v,c,f,nx;
Edge() {}
Edge(int v,int c,int f,int nx):v(v),c(c),f(f),nx(nx) {}
} E[MAXM];
int G[MAXN],cur[MAXN],pre[MAXN],dis[MAXN],gap[MAXN],sz;
void init()
{
sz=;
memset(G,-,sizeof(G));
}
void add_edge(int u,int v,int c)
{
E[sz]=Edge(v,c,,G[u]);
G[u]=sz++;
E[sz]=Edge(u,,,G[v]);
G[v]=sz++;
}
bool bfs(int S,int T)
{
static int Q[MAXN];
memset(dis,-,sizeof(dis));
dis[S]=;
Q[]=S;
for (int h=,t=,u,v,it; h<t; ++h)
{
for (u=Q[h],it=G[u]; ~it; it=E[it].nx)
{
if (dis[v=E[it].v]==-&&E[it].c>E[it].f)
{
dis[v]=dis[u]+;
Q[t++]=v;
}
}
}
return dis[T]!=-;
}
int dfs(int u,int T,int low)
{
if (u==T) return low;
int ret=,tmp,v;
for (int &it=cur[u]; ~it&&ret<low; it=E[it].nx)
{
if (dis[v=E[it].v]==dis[u]+&&E[it].c>E[it].f)
{
if (tmp=dfs(v,T,min(low-ret,E[it].c-E[it].f)))
{
ret+=tmp;
E[it].f+=tmp;
E[it^].f-=tmp;
}
}
}
if (!ret) dis[u]=-;
return ret;
}
int dinic(int S,int T)
{
int maxflow=,tmp;
while (bfs(S,T))
{
memcpy(cur,G,sizeof(G));
while (tmp=dfs(S,T,inf)) maxflow+=tmp;
}
return maxflow;
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
bool ok=;
memset(mmin,,sizeof(mmin));
init();
int n,m,x,y,z,k;
char typ[];
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
mmax[i][j]=inf;
}
}
for(int i=; i<=n; i++)
{
scanf("%d",&hang[i]);
}
for(int i=; i<=m; i++)
{
scanf("%d",&lie[i]);
}
scanf("%d",&k);
for(int i=; i<=k; i++)
{
scanf("%d%d%s%d",&x,&y,typ,&z);
if(x==)
{
if(y==)
{
for(int j=; j<=n; j++)
{
for(int kk=; kk<=m; kk++)
{
if(typ[]=='<')
{
mmax[j][kk]=min(mmax[j][kk],z-);
}
else if(typ[]=='>')
{
mmin[j][kk]=max(mmin[j][kk],z+);
}
else
{
mmax[j][kk]=min(mmax[j][kk],z);
mmin[j][kk]=max(mmin[j][kk],z);
}
}
}
}
else
{
for(int j=; j<=n; j++)
{
if(typ[]=='<')
{
mmax[j][y]=min(mmax[j][y],z-);
}
else if(typ[]=='>')
{
mmin[j][y]=max(mmin[j][y],z+);
}
else
{
mmax[j][y]=min(mmax[j][y],z);
mmin[j][y]=max(mmin[j][y],z);
}
}
}
}
else
{
if(y==)
{
for(int j=; j<=m; j++)
{
if(typ[]=='<')
{
mmax[x][j]=min(mmax[x][j],z-);
}
else if(typ[]=='>')
{
mmin[x][j]=max(mmin[x][j],z+);
}
else
{
mmax[x][j]=min(mmax[x][j],z);
mmin[x][j]=max(mmin[x][j],z);
}
}
}
else
{
if(typ[]=='<')
{
mmax[x][y]=min(mmax[x][y],z-);
}
else if(typ[]=='>')
{
mmin[x][y]=max(mmin[x][y],z+);
}
else
{
mmax[x][y]=min(mmax[x][y],z);
mmin[x][y]=max(mmin[x][y],z);
}
}
}
}
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
if(mmax[i][j]<||mmax[i][j]<mmin[i][j])
{
ok=;
break;
}
hang[i]-=mmin[i][j];
lie[j]-=mmin[i][j];
if(hang[i]<||lie[j]<)
{
ok=;
break;
}
}
}
int ans1,ans2;
if(ok){
for(int i=; i<=n; i++)
{
add_edge(,i,hang[i]);
}
for(int i=n+; i<=m+n; i++)
{
add_edge(i,n+m+,lie[i-n]);
}
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
add_edge(i,n+j,mmax[i][j]-mmin[i][j]);
}
}
ans1=,ans2=;
for(int i=; i<=n; i++)
{
ans1+=hang[i];
}
for(int i=; i<=m; i++)
{
ans2+=lie[i];
}
if(ans1!=ans2)
{
ok=;
}}
if(ok){
if(dinic(,m+n+)==ans1)
{
memcpy(cur,G,sizeof(G));
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
{
int v;
for (int it=cur[i]; ~it; it=E[it].nx)
{
v=E[it].v;
if (v==n+j)
{
printf("%d ",E[it].f+mmin[i][j]);
break;
}
}
}
puts("");
}
}
else
{
ok=;
}}
if(ok==)puts("IMPOSSIBLE");
if(cas)puts("");
}
}
POJ 2396 Budget【网络流】的更多相关文章
- POJ 2396 Budget 有上下界的网络流
POJ 2396 Budget 题意简述:给定矩阵(每个元素都是非负整数)各行各列的和,并且限制其中的某些元素,给出一个可行解,特殊评测.矩阵规模小于200*20. 网络流的模型是显而易见的,不过对 ...
- poj 2396 Budget 边容量有上下界的最大流
题意: 给一个矩阵的每行和及每列和,在给一些行列或点的限制条件.求一个满足的矩阵. 分析: 转化为有上下界的网络流,注意等于也是一种上下界关系,然后用dinic算法. 代码: //poj 2396 / ...
- POJ 2396 Budget(有源汇上下界网络流)
Description We are supposed to make a budget proposal for this multi-site competition. The budget pr ...
- POJ 2396 Budget ——有上下界的网络流
给定矩阵的每行每列的和,和一些大于小于等于的限制.然后需要求出一组可行解. 上下界网络流. 大概的思想就是计算出每一个点他需要强行流入或者流出的量,然后建出超级源点和汇点,然后删除下界,就可以判断是否 ...
- poj 2396 Budget【有上下界的网络流】
第一步:建立无源汇有上下界的网络模型 每行 i 作为一个点并连边(s, i, Ri, Ri),每列 j 作为一个点并连边(j, t, Cj, Cj),设 Uij, Lij 分别表示第 i 行第 j 列 ...
- POJ 2396 Budget (上下界网络流有源可行流)
转载: http://blog.csdn.net/axuan_k/article/details/47297395 题目描述: 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表 ...
- poj 2396 Budget
一个m行n列的矩阵,给出每行每列中元素的和,以及对一些格子的大小限制,求一个可行方案,输出矩阵. 大小限制形如:严格大于i,严格小于i,等于i. 1<=m<=200.1<=n< ...
- POJ 2396 Budget (有源汇有上下界最大流)
题意:给定一个矩阵的每行的和和每列的和,以及每个格子的限制,让你求出原矩阵. 析:把行看成X,列看成Y,其实就是二分图,然后每个X到每个Y边一条边,然后加一个超级源点和汇点分别向X和Y连边,这样就形成 ...
- [poj] 2396 [zoj] 1994 budget || 有源汇的上下界可行流
poj原题 zoj原题 //注意zoj最后一行不要多输出空行 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表不同赛区支出的矩阵.组委会曾经开会讨论过各类支出的总和,以及各赛区 ...
随机推荐
- Asianux3配置yum
把下面四个文件放到/etc/yum.repos.d目录下 dag.repo: [dag] name=Dag RPM Repository for RHEL5 baseurl=http://mirror ...
- linux 下 nginx 启动服务器 80端口被占用问题
把80端口占用的程序杀死 sudo fuser -k 80/tcp rm -fr 文件 ----删除文件及文加下的所有文件 echo > filename ---清空文件的内容
- 日期转换工具类 CommUtil.java
package com.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.ut ...
- mysql.server 文件修改起动多实例
如果你用mysql.server来启动的话,就要注意一下点,要修改一下里面的内容,修改如下:大约218行左右 查看复制打印? then print_defaults="$bindir/mys ...
- Python爬虫(图片)编写过程中遇到的问题
最近我突然对网络爬虫开窍了,真正做起来的时候发现并不算太难,都怪我以前有点懒,不过近两年编写了一些程序,手感积累了一些肯定也是因素,总之,还是惭愧了.好了,说正题,我把这两天做爬虫的过程中遇到的问题总 ...
- Spring入门学习(一)
SpringMVC基础平台补充(2016.03.03) 如果想要开发SpringMVC,那么前期依次安装好:JDK(jdk-8u74-windows-x64,安装后配置环境变量JAVA_HOME和CL ...
- 【linux】常见的网络管理命令
last:查看目前和过去的用户登录信息 [root@paulinux ~]# last root pts/0 192.168.1.106 Fri Jun 10 09:53 still logged i ...
- Async 和 Await的性能(.NET4.5新异步编程模型)
异步编程长时间以来一直都是那些技能高超.喜欢挑战自我的开发人员涉足的领域 — 这些人愿意花费时间,充满热情并拥有心理承受能力,能够在非线性的控制流程中不断地琢磨回调,之后再回调. 随着 Microso ...
- bzoj3905: Square
Description Nothing is more beautiful than square! So, given a grid of cells, each cell being black ...
- bzoj1803: Spoj1487 Query on a tree III
Description You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the ...