Description

XWW是个影响力很大的人,他有很多的追随者。这些追随者都想要加入XWW教成为XWW的教徒。但是这并不容易,需要通过XWW的考核。
XWW给你出了这么一个难题:XWW给你一个N*N的正实数矩阵A,满足XWW性。
称一个N*N的矩阵满足XWW性当且仅当:(1)A[N][N]=0;(2)矩阵中每行的最后一个元素等于该行前N-1个数的和;(3)矩阵中每列的最后一个元素等于该列前N-1个数的和。
现在你要给A中的数进行取整操作(可以是上取整或者下取整),使得最后的A矩阵仍然满足XWW性。同时XWW还要求A中的元素之和尽量大。

Input

第一行一个整数N,N ≤ 100。
接下来N行每行包含N个绝对值小于等于1000的实数,最多一位小数。

Output

输出一行,即取整后A矩阵的元素之和的最大值。无解输出No。

Sample Input

4
3.1 6.8 7.3 17.2
9.6 2.4 0.7 12.7
3.6 1.2 6.5 11.3
16.3 10.4 14.5 0

Sample Output

129

HINT

【数据规模与约定】

有10组数据,n的大小分别为10,20,30...100。

【样例说明】

样例中取整后满足XWW性的和最大的矩阵为:

3 7 8 18

10 3 0 13

4 1 7 12

17 11 15 0

  1. /*
  2. 上下界最大流。
  3. 建立源点SS,从SS向i连一条上下界为(floor(a[i][n]),ceil(a[i][n]))的边;
  4. 建立源点TT,从i'向TT连一条上下界为(floor(a[n][i]),ceil(a[n][i]))的边;
  5. 建立i->i'上下界为(floor(a[i][j]),ceil(a[i][j]))的边。
  6. 跑上下界最大流。
  7. */
  8. #include<cstdio>
  9. #include<iostream>
  10. #include<queue>
  11. #include<cstring>
  12. #define N 210
  13. #define M 21000
  14. #define inf 1000000000
  15. using namespace std;
  16. int down[N][N],up[N][N],head[N],dis[N],s[N],n,cnt=,SS,TT,S,T;
  17. struct node{int v,f,pre;}e[M];
  18. queue<int> q;
  19. void add(int u,int v,int f){
  20. e[++cnt].v=v;e[cnt].f=f;e[cnt].pre=head[u];head[u]=cnt;
  21. e[++cnt].v=u;e[cnt].f=;e[cnt].pre=head[v];head[v]=cnt;
  22. }
  23. bool bfs(){
  24. memset(dis,-,sizeof(dis));
  25. q.push(S);dis[S]=;
  26. while(!q.empty()){
  27. int u=q.front();q.pop();
  28. for(int i=head[u];i;i=e[i].pre){
  29. if(!e[i].f||dis[e[i].v]!=-) continue;
  30. dis[e[i].v]=dis[u]+;
  31. q.push(e[i].v);
  32. }
  33. }
  34. return dis[T]!=-;
  35. }
  36. int dinic(int x,int f){
  37. int rest=f;
  38. if(x==T) return f;
  39. for(int i=head[x];i;i=e[i].pre){
  40. if(!e[i].f||dis[e[i].v]!=dis[x]+) continue;
  41. int t=dinic(e[i].v,min(rest,e[i].f));
  42. e[i].f-=t;e[i^].f+=t;rest-=t;
  43. }
  44. if(rest==f) dis[x]=-;
  45. return f-rest;
  46. }
  47. int main(){
  48. scanf("%d",&n);
  49. SS=n*+;TT=n*+;S=n*+;T=n*+;
  50. for(int i=;i<=n;i++)
  51. for(int j=;j<=n;j++){
  52. double x;scanf("%lf",&x);
  53. down[i][j]=int(x);
  54. up[i][j]=int(x+0.99);
  55. }
  56. for(int i=;i<n;i++){
  57. if(down[i][n]!=up[i][n]) add(SS,i,);
  58. if(down[n][i]!=up[n][i]) add(i+n,TT,);
  59. s[SS]+=down[i][n];s[i]-=down[i][n];
  60. s[i+n]+=down[n][i];s[TT]-=down[n][i];
  61. }
  62. for(int i=;i<n;i++)
  63. for(int j=;j<n;j++){
  64. if(down[i][j]!=up[i][j]) add(i,j+n,);
  65. s[i]+=down[i][j];s[j+n]-=down[i][j];
  66. }
  67. int tot=;
  68. for(int i=;i<=T;i++){
  69. if(s[i]>) add(i,T,s[i]),tot+=s[i];
  70. if(s[i]<) add(S,i,-s[i]);
  71. }
  72. add(TT,SS,inf);
  73. int maxflow=;
  74. while(bfs()) maxflow+=dinic(S,inf);
  75. if(maxflow!=tot) {printf("No");return ;}
  76. maxflow=;
  77. S=SS;T=TT;
  78. while(bfs()) maxflow+=dinic(S,inf);
  79. printf("%d",maxflow*);
  80. return ;
  81. }

XWW的难题(bzoj 3698)的更多相关文章

  1. BZOJ 3698: XWW的难题 [有源汇上下界最大流]

    3698: XWW的难题 题意:(1)A[N][N]=0:(2)矩阵中每行的最后一个元素等于该行前N-1个数的和:(3)矩阵中每列的最后一个元素等于该列前N-1个数的和.给A中的数进行取整操作(可以是 ...

  2. 3698: XWW的难题[有源汇上下界最大流]

    3698: XWW的难题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 354  Solved: 178[Submit][Status][Discus ...

  3. [BZOJ3698] XWW的难题 网络流

    3698: XWW的难题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 533  Solved: 275[Submit][Status][Discus ...

  4. 【BZOJ3698】XWW的难题 有上下界的最大流

    [BZOJ3698]XWW的难题 Description XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核.XWW给你出了 ...

  5. BZOJ 3698: XWW的难题(有源汇上下界最大流)

    题面 XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核. XWW给你出了这么一个难题:XWW给你一个N*N的正实数矩阵A, ...

  6. BZOJ 3698: XWW的难题

    Description XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核. XWW给你出了这么一个难题:XWW给你一个N ...

  7. BZOJ 3698 XWW的难题:有上下界的最大流

    传送门 题意 给你一个 $ n*n $ 的正实数矩阵 $ A $ ,满足XWW性. 称一个 $ n*n $ 的矩阵满足XWW性当且仅当: $ A[n][n] = 0 $ 矩阵中每行的最后一个元素等于该 ...

  8. bzoj 3698 XWW的难题(有源汇的上下界最大流)

    [题意] 对每个格子确定上下取整,使得满足1.A[n][n]=0 2.每行列前n-1个之和为第n个 3.格子之和尽量大. [思路] 设格子(i,j)上下取整分别为up(i,j)down(i,j),构图 ...

  9. BZOJ.3698.XWW的难题(有源汇上下界最大流ISAP)

    题目链接 按套路行列作为两部分,连边 \(S->row->column->T\). S向代表行的元素连边cap(A[i][n])(容量上下界为上下取整),代表列的元素向T连边cap( ...

随机推荐

  1. 1412: [ZJOI2009]狼和羊的故事

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4017  Solved: 2037[Submit][Status][Discuss] Descript ...

  2. 微信公众帐号开发之一(java)

    闲来没事,就记录一下微信公众平台的开发吧~ 其实微信公众平台开发没有想象中的那么困难,因为注册了微信公众平台帐号登录之后在开发者模式里有详细的文档,个人感觉介绍还是比较详细的. 微信公众平台订阅号和服 ...

  3. 【PHP】常用的PHP正则表达式收集整理

    匹配中文字符的正则表达式: [\u4e00-\u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^\x00-\xff]评注:可以用来计算字符串的长度 ...

  4. nginx的缓存服务

    都知道缓存的目的是为了减小服务端的压力,可以在客户端直接取到数据 客户端---------------nginx(代理缓存)------------------服务端 代理缓存的描述: 就是客户端发送 ...

  5. 在Ubuntu下配置jdk+maven

    1.在官网上下载对应Linux版本的jdk 2.在终端输入命令将下载好的jdk解压并且转移到指定的路径如:首先执行 tar -zxvf jdk-8u181-linux-x64.tar.gz    然后 ...

  6. 《鸟哥的Linux私房菜》学习笔记(5)——权限管理

    一.权限的基本概念                                                   权限:访问计算机资源或服务的访问能力. Linux中,每一个资源或者服务的权限, ...

  7. Spring---浅谈IOC

    概念 IOC(Inversion of Control 控制反转)是spring的核心,贯穿始终.所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系. 传统 ...

  8. git---gui使用

    1.登陆的命令: git config –global user.email "1455971532@qq.com" git config –global user.name &q ...

  9. laravel5.2总结--csrf保护

      CSRF攻击:     CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作.我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 S ...

  10. python 学习分享-函数篇2

    递归 自己玩自己的函数: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少 3. 递归效率不高,递归层次过多会导致栈溢出 递归例子和二分查找都放在里面了 ...