题目大意:

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中的元素之和尽量大。

思路:

首先这一题的建模还是挺有意思的。每一个点的取值有一个范围,同时还要要求它们加起来的和要在某一个范围之内。于是便自然地想到了每一个点为一条流量然后一起流到一个管道里然后这个管道的流量也是有上下界的,模型的大概就这样建出来了。
但是烦恼了我挺久的就是这题是一个二维矩阵,对于每一个点所代表的流量它既要汇合到它这一横行,又要汇合到这一竖行,显然流量是单向流动的,并且流量汇合了之后又不可以重新分开成之前没汇合的一样,这里想了我很久。
然后就突然想到,为什么一定要汇合呢?在每一行汇合前每一个格子的流量可以从它的那一列引出来啊,这样就可以当做是每一列拆开成n−1n−1n-1个流量之后再分别汇到那n−1n−1n-1行去,然后就可以完美地套用有上下界的最大流了。
有上下界的最大流大体上和有上下界的最小流是差不多的,最后的推流只不过是顺着推流罢了。

/*============================* Author : ylsoi* Problem : bzoj3698* Algorithm : Max_Flow* Time : 2018.7.29* =========================*/
#include<bits/stdc++.h>#define REP(i,a,b) for(int i=a;i<=b;++i)
typedef long long ll;using namespace std;void File(){freopen("bzoj3698.in","r",stdin);freopen("bzoj3698.out","w",stdout);
}const int maxn=100+10;
const int maxe=1e5+10;
const int inf=0x3f3f3f3f;
int n,s,t,ss,tt,sumf,ans;
int a[maxn][maxn],b[maxn][maxn],c[maxn<<1],sum;
int beg[maxn<<1],las[maxe<<1],to[maxe<<1],flow[maxe<<1],cnte=1;void add(int u,int v,int f){las[++cnte]=beg[u]; beg[u]=cnte; to[cnte]=v; flow[cnte]=f;las[++cnte]=beg[v]; beg[v]=cnte; to[cnte]=u; flow[cnte]=0;
}struct dinic{int num[maxn<<1],cur[maxn<<1];queue<int>qu;bool bfs(){memset(num,0,sizeof(num));num[ss]=1; qu.push(ss);while(qu.size()){int u=qu.front(); qu.pop();for(int i=beg[u];i;i=las[i]){if(!flow[i] || num[to[i]])continue;num[to[i]]=num[u]+1;qu.push(to[i]);}}return num[tt]!=0;}int dfs(int u,int res){if(u==tt || !res)return res;int ret=0,f;for(int &i=cur[u];i;i=las[i]){if(num[to[i]]!=num[u]+1)continue;if((f=dfs(to[i],min(res,flow[i])))){ret+=f;res-=f;flow[i]-=f;flow[i^1]+=f;}if(!res)break;}return ret;}void work(){while(bfs()){REP(i,ss,tt)cur[i]=beg[i];sumf+=dfs(ss,inf);}}
}T;bool init(){scanf("%d",&n);double tmp;REP(i,1,n)REP(j,1,n){scanf("%lf",&tmp);a[i][j]=floor(tmp);b[i][j]=ceil(tmp);if(i==n && j==n && tmp)return false;}REP(i,1,n-1){c[i]+=a[i][n];REP(j,1,n-1)c[i]-=a[i][j];}REP(i,1,n-1){c[i+n-1]-=a[n][i];REP(j,1,n-1)c[i+n-1]+=a[j][i];}s=n*2-1; t=n*2;ss=0; tt=n*2+1;REP(i,1,n-1){add(s,i,b[i][n]-a[i][n]);add(i+n-1,t,b[n][i]-a[n][i]);}REP(i,1,n-1)REP(j,1,n-1)add(i,j+n-1,b[i][j]-a[i][j]);int sum1=0,sum2=0;REP(i,1,n-1){sum1+=a[i][n];sum2+=a[n][i];}add(s,tt,sum1);add(ss,t,sum2);sum+=sum2;REP(i,1,n-1){if(c[i]>0)sum+=c[i];if(c[i]>0)add(ss,i,c[i]);else add(i,tt,-c[i]);if(c[i+n-1]>0)add(ss,i+n-1,c[i+n-1]);else add(i+n-1,tt,-c[i+n-1]);}add(t,s,inf);return true;
}int main(){File();if(init()){T.work();if(sum!=sumf){puts("No");return 0;}ans=flow[cnte];sumf=0;beg[ss]=0; beg[tt]=0;beg[t]=las[beg[t]]; beg[s]=las[beg[s]];REP(i,1,2*n)beg[i]=las[beg[i]];add(ss,s,inf); add(t,tt,inf);T.work();printf("%d\n",(ans+sumf)*3);}else puts("No");return 0;
}

[bzoj3698]XWW的难题——有上下界的最大流相关推荐

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

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

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

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

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

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

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

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

  5. 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] ...

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

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

  7. CodeForces - 1252L Road Construction(基环树+有源汇有上下界的最大流)

    题目链接:点击查看 题目大意:给出 n 个节点,再给出 n 个出边,保证所有的边能将 n 个点连通,每条出边可以用 m[ i ] 种材料选择其一建造,然后有 k 个工人,每个工人只可以使用一种材料建造 ...

  8. 洛谷 - P5192 Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流(有源汇有上下界的最大流)

    题目链接:点击查看 题目大意:一共有 n 天,每天可以拍最多 D[ i ] 张照片,每天可以选择 C[ i ] 个少女进行拍照,每个少女的编号为 T[ i ][ j ] ,每个少女需要拍摄照片的区间为 ...

  9. POJ 2396 有上下界的可行流

    题意: 有一个n*m的方阵,里面的数字未知,但是我们知道如下约束条件: 每一行的数字的和 每一列的数字的和 某些格子有特殊的大小约束,用大于号,小于号和等于号表示 问:是否存在用正数填充这个方阵的方案 ...

最新文章

  1. 用php获取本周,上周,本月,上月,本季度日期的代码
  2. 程序间数据共享与传递(1):EXPORT/IMPORT、SAP/ABAP Memory
  3. C#中实现计时器功能(定时任务和计时多长时间后执行某方法)
  4. 数据预处理--样本选择、交叉验证
  5. 实验图文详解——apache的编译安装及httpd服务开机自启
  6. powershell一行代码批量修改文件名(附命令详解)
  7. CommonsChunkPlugin相关
  8. python progressbar 倒计时_Python使用progressbar模块实现的显示进度条功能
  9. Car-like Robot运动参数分析
  10. 个人电话号码查询系统
  11. xp系统dns服务器有问题,xp系统dns错误的恢复方法
  12. cef 前进后台 实现_使用CefSharp前端后台交换
  13. 【Unity】制作简单的启动、菜单和游戏界面
  14. Matlab 画热力图(heat-map)
  15. safari支持java_BLOB URL无法在Safari中使用
  16. css3特效框,科技常识:6种非常炫酷的CSS3按钮边框动画特效
  17. c#调用windows虚拟键盘
  18. 几款比较好用的比较软件
  19. 华科计算机组成原理 头歌Educoder Logisim 运算器设计(HUST) 1~11关满分通关
  20. 《RocketMQ源码分析》NameServer如何处理Broker的连接

热门文章

  1. 形态等位点对迭代次数的贡献
  2. 【转】ArcGIS server如何将自己的小地图叠加到Google maps或者Virtual Earth上
  3. mac address 的一些操作
  4. matlab中frame是什么意思,frame2time结果是什么含义?
  5. JVM基础知识---对象的创建过程
  6. org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.Mav
  7. AIGC用于智能写作的技术综述-达观数据
  8. 菜鸟win7双系统安装教程 两个系统都用Win7
  9. 「镁客·请讲」VR的拓荒者,幻境视界让VR内容拥有艺术之美
  10. Qt 错误 The process was ended forcefully(无法定位程序输入点 于动态链接库)