题意:

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【网络流】的更多相关文章

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

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

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

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

  3. POJ 2396 Budget(有源汇上下界网络流)

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

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

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

  5. poj 2396 Budget【有上下界的网络流】

    第一步:建立无源汇有上下界的网络模型 每行 i 作为一个点并连边(s, i, Ri, Ri),每列 j 作为一个点并连边(j, t, Cj, Cj),设 Uij, Lij 分别表示第 i 行第 j 列 ...

  6. POJ 2396 Budget (上下界网络流有源可行流)

    转载: http://blog.csdn.net/axuan_k/article/details/47297395 题目描述: 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表 ...

  7. poj 2396 Budget

    一个m行n列的矩阵,给出每行每列中元素的和,以及对一些格子的大小限制,求一个可行方案,输出矩阵. 大小限制形如:严格大于i,严格小于i,等于i. 1<=m<=200.1<=n< ...

  8. POJ 2396 Budget (有源汇有上下界最大流)

    题意:给定一个矩阵的每行的和和每列的和,以及每个格子的限制,让你求出原矩阵. 析:把行看成X,列看成Y,其实就是二分图,然后每个X到每个Y边一条边,然后加一个超级源点和汇点分别向X和Y连边,这样就形成 ...

  9. [poj] 2396 [zoj] 1994 budget || 有源汇的上下界可行流

    poj原题 zoj原题 //注意zoj最后一行不要多输出空行 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表不同赛区支出的矩阵.组委会曾经开会讨论过各类支出的总和,以及各赛区 ...

随机推荐

  1. LINUX系统下PHP显示空白页

    因为手工转移,文件所属用户及用户组是root,所以需要把网站程序及数据库都改成对应用户组:如www和mysql. 更改目录所属用户执行命令: chown -R 用户.用户组 目录名, 如:chown ...

  2. Oracle报错,ORA-28001: 口令已经失效

    Oracle11G创建用户时缺省密码过期限制是180天(即6个月), 如果超过180天用户密码未做修改则该用户无法登录. Oracle公司是为了数据库的安全性默认在11G中引入了这个默认功能,但是这个 ...

  3. SQL SERVER 只有MDF文件的恢复

    方式一: .create a database same name as .mdf file; .Stop SQL Server; . recover .mdf file; . Start SQL S ...

  4. linux下mongodb定时备份指定的集合

    目标:把一台linux机上mongodb的数据定时备份到另一台机上: 过程: 一开始打算使用mongoexport和mongoimport,但是总是会报“\x00”字符串不能识别的问题,后来就改成了m ...

  5. 我的IT相关网址收藏

    it语言学习免费视频: 尚学堂:http://www.sxt.cn/ 慕课网:http://www.imooc.com/course/list 大学生自学网:http://v.dxsbb.com/ 尚 ...

  6. JavaScript中Call()以及Apply()的应用

    apply()和call()的真正用武之地是能够扩充函数赖以运行的作用域 三点说明: 1.每个函数都包含两个非继承而来的方法:apply()和call(). 2.他们的用途相同,都是在特定的作用域中调 ...

  7. (WPF, MVVM) Slider Binding.

    对于Button的Command的绑定可以通过实现ICommand接口来进行,但是Slider并没有Command属性. 另外如果要实现MVVM模式的话,需要将一些Method和Slider的Even ...

  8. [jQuery]attr和prop的区别

    转自:http://www.cnblogs.com/Showshare/p/different-between-attr-and-prop.html 在高版本的jquery引入prop方法后,什么时候 ...

  9. AP_AP系列 - 费用报表分析(案例)

    2014-07-08 Created By BaoXinjian

  10. input file 上传文件

    面试的时候遇到一个问题,要求手写的方式上传文件. 本来觉得很简单,但是结果怎么也成功不了. 前台: <form ID="form1" action="AcceptF ...