http://poj.org/problem?id=2396 (题目链接)

题意

  给出一个矩阵,给出每一行每一列的和,以及若干限制条件,限制了其中每一个元素的上下界,求一种可行的方案使得每一行每一列数的和满足要求。

Solution

  我已经完全没有网络流思维了,江化了= 。=

  源点向每一行和每一列连上下界都为其对应和的边,行与列之间连边,边的上下界为对应格子的取值范围。然后跑上下界网络流找一条可行流就可以了。

细节

  mdzz初值设太大爆int了=  =,还有这种事。。

代码

// poj2396
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf (1ll<<29)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=1010;
int head[maxn],fi[maxn],d[maxn],upp[maxn][maxn],low[maxn][maxn],id[maxn][maxn];
int n,m,s,c,t,S,T,SS,TT,cnt,sum,flag;
struct edge {int to,next,w;}e[maxn*maxn]; void link(int u,int v,int w) {
e[++cnt]=(edge){v,head[u],w};head[u]=cnt;
e[++cnt]=(edge){u,head[v],0};head[v]=cnt;
}
bool bfs() {
memset(d,-1,sizeof(d));
queue<int> q;q.push(s);d[s]=0;
while (!q.empty()) {
int x=q.front();q.pop();
for (int i=head[x];i;i=e[i].next)
if (e[i].w && d[e[i].to]<0) d[e[i].to]=d[x]+1,q.push(e[i].to);
}
return d[t]>0;
}
int dfs(int x,int f) {
if (x==t || f==0) return f;
int w,used=0;
for (int i=head[x];i;i=e[i].next) if (e[i].w && d[e[i].to]==d[x]+1) {
w=dfs(e[i].to,min(e[i].w,f-used));
used+=w,e[i].w-=w,e[i^1].w+=w;
if (used==f) return used;
}
if (!used) d[x]=-1;
return used;
}
int Dinic(int x,int y) {
int flow=0;s=x,t=y;
while (bfs()) flow+=dfs(x,inf);
return flow;
}
void modify(int x,int y,char *r,int val) {
if (r[0]=='<') upp[x][y]=min(upp[x][y],val-1);
if (r[0]=='>') low[x][y]=max(low[x][y],val+1);
if (r[0]=='=') {
if (val>=low[x][y] && val<=upp[x][y]) upp[x][y]=low[x][y]=val;
else flag=0;
}
} int main() {
int Case;scanf("%d",&Case);
while (Case--) {
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) upp[i][j]=1000,low[i][j]=0;
memset(head,0,sizeof(head));
memset(fi,0,sizeof(fi));
S=0,T=n+m+1;SS=T+1,TT=SS+1;
cnt=1;sum=0;flag=1;
for (int x,i=1;i<=n;i++) {
scanf("%d",&x);
fi[S]-=x,fi[i]+=x;
}
for (int x,i=1;i<=m;i++) {
scanf("%d",&x);
fi[T]+=x,fi[i+n]-=x;
}
scanf("%d",&c);char ch[10];
for (int x,y,z,i=1;i<=c;i++) {
scanf("%d%d%s%d",&x,&y,ch,&z);
if (!x && !y)
for (int j=1;j<=n;j++)
for (int k=1;k<=m;k++) modify(j,k,ch,z);
else if (!x) for (int j=1;j<=n;j++) modify(j,y,ch,z);
else if (!y) for (int j=1;j<=m;j++) modify(x,j,ch,z);
else modify(x,y,ch,z);
}
for (int i=1;i<=n && flag;i++)
for (int j=1;j<=m && flag;j++) {
if (low[i][j]<=upp[i][j]) {
fi[i]-=low[i][j],fi[n+j]+=low[i][j];
link(i,n+j,upp[i][j]-low[i][j]);
id[i][j]=cnt-1;
}
else flag=0;
}
if (!flag) {puts("IMPOSSIBLE\n");continue;}
for (int i=S;i<=T;i++) {
if (fi[i]<0) link(i,TT,-fi[i]);
else link(SS,i,fi[i]),sum+=fi[i];
}
link(T,S,inf);
if (sum!=Dinic(SS,TT)) {puts("IMPOSSIBLE\n");continue;}
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++)
printf("%d ",low[i][j]+e[id[i][j]^1].w);
puts("");
}
puts("");
}
return 0;
}

【poj2396】 Budget的更多相关文章

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

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

  2. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  3. 【二分答案】 【POJ3497】 【Northwestern Europe 2007】 Assemble 组装电脑

    Assemble Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3171   Accepted: 1013 Descript ...

  4. 【Java】 内部类

    [Java]内部类 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 使用内部类的的原因主要有三点: 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据. 内部类可以对同一个包中的 ...

  5. 【Java】-NO.20.Exam.1.Java.1.001- 【1z0-807】- OCEA

    1.0.0 Summary Tittle:[Java]-NO.20.Exam.1.Java.1.001-[1z0-807] Style:EBook Series:Java Since:2017-10- ...

  6. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  7. 【Unity】9.3 粒子系统生成器详解

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 上一节已经介绍过了在Unity 5.x中两种创建粒子效果的方式(方式1.方式2). 这一节我们主要学习第2种方式的基本概 ...

  8. 图论常用算法之一 POJ图论题集【转载】

    POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...

  9. 【241】◀▶IEW-Unit06

    Unit 6 Advertising 多幅柱子在一幅图中的写作技巧 1.Model1图片分析 The bar chart contains information about the amount o ...

随机推荐

  1. 决策树(ID3,C4.5,CART)原理以及实现

    决策树 决策树是一种基本的分类和回归方法.决策树顾名思义,模型可以表示为树型结构,可以认为是if-then的集合,也可以认为是定义在特征空间与类空间上的条件概率分布. [图片上传失败...(image ...

  2. 51nod 抽卡大赛

    抽卡大赛 链接 分析: $O(n^4)$的做法比较好想,枚举第i个人选第j个,然后背包一下,求出有k个比他大的概率. 优化: 第i个人,选择一张卡片,第j个人选的卡片大于第i个人的概率是$p_j$,那 ...

  3. bootstrap datetimepicker 格式化yyyymmdd时,无法读取yyyymmdd格式

    不知为何,java程序员爱用yyyymmdd格式化日期?导致bootstrap datetimepicker无法解析正确的日期 发现js中yyyymmdd不是正常能够解析的日期 查看datetimep ...

  4. slurm用户快速入门手册

    1. 概述2. 架构3. 命令3.1 sacct3.2 sattach3.4 sbatch3.5 sbcast3.6 scancel3.7 scontrol3.8 sinfo3.9 smap3.10 ...

  5. html绝对路径,相对路径

    .com/eat.php中引用.com/includes/headrt.php的话写includes/header.php .com/service/eat.php中引用.com/includes/h ...

  6. LB层到Real Server之间访问请求的响应时间及HTTP状态码监控及报警设置

    为了监控到各业务的访问质量,基于LB层的Nginx日志,实现LB层到Real Server之间访问请求的响应时间(即upstream_response_time)及HTTP状态码(即upstream_ ...

  7. php安全配置记录和常见错误梳理

    通常部署完php环境后会进行一些安全设置,除了熟悉各种php漏洞外,还可以通过配置php.ini来加固PHP的运行环境,PHP官方也曾经多次修改php.ini的默认设置.下面对php.ini中一些安全 ...

  8. 《Linux内核设计与实现》第3章读书整理

    第三章.进程管理 3.1进程 1.进程就是处于执行期的程序,但进程并不仅仅局限于一段可执行程序代码 2.执行线程: 简称线程,是在进程中活动的对象.每个线程都拥有一个独立的程序计数器.进程栈和一组进程 ...

  9. Linux第五周学习总结

    作者:黎静 一.知识点总结 (一)给MenuOS增加time和time-asm命令 1.更新menu代码到最新版 2.test.c中main函数里,增加MenuConfig() 3.增加对应的两个函数 ...

  10. Leetcode——171.宝石与石头

    水题: 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石. J 中的字母不重复,J 和 S中的所有字符 ...