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

题意

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

Solution

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

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

细节

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

代码

  1. // poj2396
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<cstdio>
  7. #include<cmath>
  8. #include<queue>
  9. #define LL long long
  10. #define inf (1ll<<29)
  11. #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
  12. using namespace std;
  13.  
  14. const int maxn=1010;
  15. int head[maxn],fi[maxn],d[maxn],upp[maxn][maxn],low[maxn][maxn],id[maxn][maxn];
  16. int n,m,s,c,t,S,T,SS,TT,cnt,sum,flag;
  17. struct edge {int to,next,w;}e[maxn*maxn];
  18.  
  19. void link(int u,int v,int w) {
  20. e[++cnt]=(edge){v,head[u],w};head[u]=cnt;
  21. e[++cnt]=(edge){u,head[v],0};head[v]=cnt;
  22. }
  23. bool bfs() {
  24. memset(d,-1,sizeof(d));
  25. queue<int> q;q.push(s);d[s]=0;
  26. while (!q.empty()) {
  27. int x=q.front();q.pop();
  28. for (int i=head[x];i;i=e[i].next)
  29. if (e[i].w && d[e[i].to]<0) d[e[i].to]=d[x]+1,q.push(e[i].to);
  30. }
  31. return d[t]>0;
  32. }
  33. int dfs(int x,int f) {
  34. if (x==t || f==0) return f;
  35. int w,used=0;
  36. for (int i=head[x];i;i=e[i].next) if (e[i].w && d[e[i].to]==d[x]+1) {
  37. w=dfs(e[i].to,min(e[i].w,f-used));
  38. used+=w,e[i].w-=w,e[i^1].w+=w;
  39. if (used==f) return used;
  40. }
  41. if (!used) d[x]=-1;
  42. return used;
  43. }
  44. int Dinic(int x,int y) {
  45. int flow=0;s=x,t=y;
  46. while (bfs()) flow+=dfs(x,inf);
  47. return flow;
  48. }
  49. void modify(int x,int y,char *r,int val) {
  50. if (r[0]=='<') upp[x][y]=min(upp[x][y],val-1);
  51. if (r[0]=='>') low[x][y]=max(low[x][y],val+1);
  52. if (r[0]=='=') {
  53. if (val>=low[x][y] && val<=upp[x][y]) upp[x][y]=low[x][y]=val;
  54. else flag=0;
  55. }
  56. }
  57.  
  58. int main() {
  59. int Case;scanf("%d",&Case);
  60. while (Case--) {
  61. scanf("%d%d",&n,&m);
  62. for (int i=1;i<=n;i++)
  63. for (int j=1;j<=m;j++) upp[i][j]=1000,low[i][j]=0;
  64. memset(head,0,sizeof(head));
  65. memset(fi,0,sizeof(fi));
  66. S=0,T=n+m+1;SS=T+1,TT=SS+1;
  67. cnt=1;sum=0;flag=1;
  68. for (int x,i=1;i<=n;i++) {
  69. scanf("%d",&x);
  70. fi[S]-=x,fi[i]+=x;
  71. }
  72. for (int x,i=1;i<=m;i++) {
  73. scanf("%d",&x);
  74. fi[T]+=x,fi[i+n]-=x;
  75. }
  76. scanf("%d",&c);char ch[10];
  77. for (int x,y,z,i=1;i<=c;i++) {
  78. scanf("%d%d%s%d",&x,&y,ch,&z);
  79. if (!x && !y)
  80. for (int j=1;j<=n;j++)
  81. for (int k=1;k<=m;k++) modify(j,k,ch,z);
  82. else if (!x) for (int j=1;j<=n;j++) modify(j,y,ch,z);
  83. else if (!y) for (int j=1;j<=m;j++) modify(x,j,ch,z);
  84. else modify(x,y,ch,z);
  85. }
  86. for (int i=1;i<=n && flag;i++)
  87. for (int j=1;j<=m && flag;j++) {
  88. if (low[i][j]<=upp[i][j]) {
  89. fi[i]-=low[i][j],fi[n+j]+=low[i][j];
  90. link(i,n+j,upp[i][j]-low[i][j]);
  91. id[i][j]=cnt-1;
  92. }
  93. else flag=0;
  94. }
  95. if (!flag) {puts("IMPOSSIBLE\n");continue;}
  96. for (int i=S;i<=T;i++) {
  97. if (fi[i]<0) link(i,TT,-fi[i]);
  98. else link(SS,i,fi[i]),sum+=fi[i];
  99. }
  100. link(T,S,inf);
  101. if (sum!=Dinic(SS,TT)) {puts("IMPOSSIBLE\n");continue;}
  102. for (int i=1;i<=n;i++) {
  103. for (int j=1;j<=m;j++)
  104. printf("%d ",low[i][j]+e[id[i][j]^1].w);
  105. puts("");
  106. }
  107. puts("");
  108. }
  109. return 0;
  110. }

【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. html5录音支持pc和Android、ios部分浏览器,微信也是支持的,JavaScript getUserMedia

    以前在前人基础上重复造了一个网页录音的轮子,顺带把github仓库使用研究了一下,扔到了github上. 优势在于结构简单,可插拔式的录音格式支持,几乎可以支持任意格式(前提有相应的编码器):默认提供 ...

  2. Spring Boot 2.0(七):Spring Boot 如何解决项目启动时初始化资源

    在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初始化资 ...

  3. MVC_防止HttpPost重复提交

    重复提交的场景很常见,可能是当时服务器延迟的原因,如购物车物品叠加,重复提交多个订单.常见的解决方法是提交后把Button在客户端Js禁用,或是用Js禁止后退键等.在ASP.NET MVC 3 Web ...

  4. Linux下IP SAN共享存储操作记录

    一.简单介绍SAN,即存储区域网络(storage area network and SAN protocols),它是一种高速网络实现计算机与存储系统之间的数据传输.常见的分类是FC-SAN和IP- ...

  5. PHP 文件写入和读取(必看篇)

    文章提纲: 一.实现文件读取和写入的基本思路 二.使用fopen方法打开文件 三.文件读取和文件写入操作 四.使用fclose方法关闭文件 五.文件指针的移动 六.Windows和UNIX下的回车和换 ...

  6. php 多个文件压缩到一起存储

    $zip = new ZipArchive();$res = $zip->open('test.zip', ZipArchive::CREATE); //不存在则创建$filepath = 's ...

  7. java注解的简单介绍

    什么是注解 1.注解就是Annontation,Annontation是Java5开始引入的新特征,中文名称叫做注解,它提供了一种安全的类似注释的机制,可以起到减少配置的成果,给程序起到辅助性的作用 ...

  8. 虚拟机Linux(centos)系统能ping通主机,主机无法ping通Linux解决方案

    本文引用:https://blog.csdn.net/clean_water/article/details/53023308 三个步骤: 第一步:虚拟机网络连接方式选择Nat 第二步.关闭liunx ...

  9. jQuery中click事件多次触发解决方案

    jQuery 中元素的click事件中绑定其他元素的click事件. 因为jQuery中的click事件会累计绑定,导致事件注册越来越多. 解决方案: 1.能够避开,避免把click事件绑定到其他元素 ...

  10. Linux 多主机SSH互信操作---noob....

    创建虚拟机后-- ssh-keygen 生成公钥和私钥对 -rw------- 1 root root 1679 11月 4 09:18 id_rsa-rw-r--r-- 1 root root 39 ...