传送门

题意

给你一个 $ n*n $ 的正实数矩阵 $ A $ ,满足XWW性。

称一个 $ n*n $ 的矩阵满足XWW性当且仅当:

  • $ A[n][n] = 0 $
  • 矩阵中每行的最后一个元素等于该行前 $ n-1 $ 个数的和(除最后一行)
  • 矩阵中每列的最后一个元素等于该列前 $ n-1 $ 个数的和(除最后一列)

现在你要给 $ A $ 中的数进行取整操作(可以是上取整或者下取整),使得最后的 $ A $ 矩阵仍然满足XWW性。

问你 $ A $ 中元素之和最大为多少。如果无解,输出"No"。

题解

考虑将每一行和每一列看做一个点。

首先从源点向每一行 $ R(i) $ 连一条上下界分别为 $ (\lfloor A[i][n] \rfloor, \lceil A[i][n] \rceil) $ 的边,从每一列 $ C(i) $ 向汇点连一条上下界分别为 $ (\lfloor A[n][i] \rfloor, \lceil A[n][i] \rceil) $ 的边。

然后对于每一个 $ A[i][j] $ 来说,连一条从 $ R(i) $ 到 $ C(i) $ 的上下界为 $ (\lfloor A[i][j] \rfloor, \lceil A[i][j] \rceil) $ 边。

这样就保证了最大流一定满足了后两个条件。

然后跑有上下界的有源汇最大流就好。

AC Code

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <queue>
#define MAX_N 205
#define INF 1000000000
#define r(x) (x)
#define c(x) (n-1+(x))using namespace std;struct Edge
{int dst,cap,rev;Edge(int _dst,int _cap,int _rev) { dst=_dst,cap=_cap,rev=_rev; }Edge(){}
};int n,s,t,S,T,tot,dif=0;
int a[MAX_N];
int it[MAX_N];
int lv[MAX_N];
double w[MAX_N][MAX_N];
vector<Edge> edge[MAX_N];
queue<int> q;void read()
{scanf("%d",&n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%lf",&w[i][j]);}}
}inline void add(int s,int t,int c)
{edge[s].push_back(Edge(t,c,edge[t].size()));edge[t].push_back(Edge(s,0,edge[s].size()-1));
}void build()
{s=(n<<1)-1,t=s+1,S=t+1,T=S+1,tot=T;for(int i=1;i<n;i++){add(s,r(i),ceil(w[i][n])-floor(w[i][n]));add(c(i),t,ceil(w[n][i])-floor(w[n][i]));a[s]-=floor(w[i][n]),a[r(i)]+=floor(w[i][n]);a[c(i)]-=floor(w[n][i]),a[t]+=floor(w[n][i]);}for(int i=1;i<n;i++){for(int j=1;j<n;j++){add(r(i),c(j),ceil(w[i][j])-floor(w[i][j]));a[r(i)]-=floor(w[i][j]),a[c(j)]+=floor(w[i][j]);}}add(t,s,INF);for(int i=1;i<=(n<<1);i++){if(a[i]>0) dif+=a[i],add(S,i,a[i]);else if(a[i]<0) add(i,T,-a[i]);}
}void bfs(int s)
{memset(lv+1,0,sizeof(int)*tot);q.push(s),lv[s]=1;while(!q.empty()){int x=q.front(); q.pop();for(int i=0;i<edge[x].size();i++){Edge temp=edge[x][i];if(temp.cap>0 && !lv[temp.dst]){lv[temp.dst]=lv[x]+1;q.push(temp.dst);}}}
}int dfs(int x,int t,int f)
{if(x==t) return f;for(int &i=it[x];i<edge[x].size();i++){Edge &temp=edge[x][i];if(temp.cap>0 && lv[x]<lv[temp.dst]){int d=dfs(temp.dst,t,min(f,temp.cap));if(d>0){temp.cap-=d;edge[temp.dst][temp.rev].cap+=d;return d;}}}return 0;
}int max_flow(int s,int t)
{int ans=0,f;while(true){bfs(s);if(!lv[t]) return ans;memset(it+1,0,sizeof(int)*tot);while((f=dfs(s,t,INF))>0) ans+=f;}
}void work()
{build();int now=max_flow(S,T);if(now!=dif){printf("No\n");return;}printf("%d\n",max_flow(s,t)*3);
}int main()
{read();work();
}

转载于:https://www.cnblogs.com/Leohh/p/9175419.html

BZOJ 3698 XWW的难题:有上下界的最大流相关推荐

  1. BZOJ 3698: XWW的难题|有上下界的网络流之最大流

    先构建可行流的模型 s−>s->每一行 流量为(a[i][n],a[i][n]+1)(a[i][n],a[i][n]+1) 每一列−>t->t 流量为(a[n][i],a[n] ...

  2. [bzoj3698]XWW的难题——有上下界的最大流

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

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

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

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

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

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

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

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

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

  7. bzoj3698: XWW的难题 有上下界的网络流

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

  8. BZOJ3698 XWW的难题(上下界网络流+gap优化的细节处理)

    XWW给你一个N*N的正实数矩阵A,满足XWW性. 称一个N*N的矩阵满足XWW性当且仅当:(1)A[N][N]=0:(2)矩阵中每行的最后一个元素等于该行前N-1个数的和:(3)矩阵中每列的最后一个 ...

  9. BZOJ 3698 XWW的难题

    上下界最大流 好久没写上下界的网络流了,赶快复习一遍.对于这道题建图不难,就是把行.列当成点,一个连S,一个连T.一个格子当成行到列的边,上下取整当成上下界即可. 先说一下上下界可行流怎么搞.我们只要 ...

最新文章

  1. 微软CEO纳德拉拥抱Linux意欲何为?
  2. 当我们在UI上点add button增加新的search criteria之后,是framework做的处理把新的row render出来
  3. Excel完成将多行多列数据转化为一列
  4. mask属性是css3的吗_使用CSS3 mask(蒙版,遮罩)属性实现超酷按钮悬停动画
  5. 入门 | 使用 SQL 构建一个关系数据库比你想的更容易
  6. 面向对象的编程-类和实例
  7. [问题已处理]-centos7 history命令没有任何记录
  8. 青龙面板滴滴果园自动签到
  9. 什么蓝绿部署(BlueGreenDeployment) ?
  10. AI常用框架和工具丨1. 科学计算库NumPy
  11. android 仿网易标签切换,高仿网易云音乐客户端的Home页面切换Tabhost-IT蓝豹
  12. JS自定义Title文字提示
  13. 超详细的逐句介绍Java网络编程之Socket类函数源码讲解(全)
  14. 最好用的Java手机_爪哇(JAVA)手机游戏谁最好玩?
  15. NodeJS中的异步编程经验
  16. 家乐福等盈利模式 遭质疑 可能影响社会稳定
  17. C++的Json解析库:jsoncpp
  18. 在python中创建一个具有特定大小的空列表
  19. python web py入门(33)- 在HTML网页里嵌入JavaScript脚本
  20. JS实现字符串加密解密

热门文章

  1. XSS漏洞原理及攻击
  2. java 如何给游戏加音效,修改添加游戏中各种音效的步骤
  3. 洛谷:三角函数,C语言
  4. 周易六十四卦——明夷卦
  5. HBase学习提纲:助你一臂之力
  6. python读图命令与效率汇总
  7. 学习Java的第七天
  8. 求圆形矩形面积java_Java求矩形面积和圆形面积的异常处理实例
  9. 分享一种 ConstraintLayout 让TextView 自适应的同时,还不超出限制范围的方式
  10. 上手机器学习前,先来学习下Python相关的环境配置吧~