题意:

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. FROM_UNIXTIME 格式化MYSQL时间戳函数

    FROM_UNIXTIME 格式化MYSQL时间戳函数 对MYSQL没有进行过深入的研究,基础知识匮乏,一遇到问题只能手册,看来要把MYSQL的学习安排进时间表了. 函数:FROM_UNIXTIME作 ...

  2. 006 [翻译] Haneke(一个Swfit iOS缓存类)

    Github项目地址:https://github.com/Haneke/HanekeSwift Haneke是一个用swift写成的轻量级iOS类,以简单好用著称(design-decisions- ...

  3. android 完全退出应用程序(重要)

    android退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个A ...

  4. HadoopDoctor:来自腾讯数据仓库TDW的MR诊断系统

    TDW是基于Hadoop生态圈研发的大数据处理平台,MapReduce计算引擎在TDW平台中承担了所有的离线数据计算,是TDW最重要的底层支撑平台之一.在TDW 平台中,除了MR程序会生成MapRed ...

  5. WebLogic11g-半小时让你的domain集群化

    WebLogic11g-半小时让你的domain集群化 WebLogic11g-负载分发 weblogic proxy.war配置 web.xml <!DOCTYPE web-app PUBLI ...

  6. CentOS快速搭建subversion服务器

    环境:centos x86_64说明:使用daemon的方式来跑svn,不使用apache首先到:http://subversion.tigris.org/ 下载最新的subversion源码 我下的 ...

  7. Hive(二):windows hive ODBC 安装

    针对Windows 32位和64位的系统对应有多个版本的 Hive ODBC Connector, 在安装的过程中,版本必须完全匹配(即:32位的 connector 只能在32位的系统运行,64位的 ...

  8. [转]PO和VO、关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) )

    摘自http://www.cnblogs.com/kelin1314/archive/2009/11/13/1602778.html PO和VO PO 即Persistence Object VO 即 ...

  9. MVC 安装

    mvc 4 支持window xp,window 7,window 8, mvc 4 支持vs2010,vs2012 vs2012中包含mvc4; vs2010中需要安装mvc4 安装包:

  10. 灵活控制 Hibernate 的日志或 SQL 输出(包含参数),以便于诊断

    首先参考:http://blog.csdn.net/zljjava/article/details/7534349  [灵活控制 Hibernate 的日志或 SQL 输出,以便于诊断] 我的具体配置 ...