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

  首先很容易看出这是一个带上下界的网络流题...

  源点向代表每一行的点连边,代表每一列的点向汇点连边

  每一行向每一列连边,连的边就如前面无源汇可行流一样

  然后由于求的是最大流,二分答案

  每次从t→s连一条下限为mid的边

  

  问题来了..最后要输出的和最终的mid有什么关系呢...

  我们考虑这张图上的流量代表什么

  我们连的边代表的刚开始没有考虑下限的边所以认为是波动的数值

  然而实际上很简单就是每个格子的数值

  最后输出的答案是整张图的数值

  每个点在自己位置、行末和列末各统计一次

  所以乘上3输出就可以了

  

  因为INF设得过小WA了两次...

program zoj2314;
const maxn = ;maxm = ;INF = ;
var fa,next,ter,w,rec,flow:array[-..maxm]of longint;
link,dis,opt,inp:array[-..maxn]of longint;
vis:array[-..maxn]of boolean;
n,m,e,tt,test,i,s,t,x,y,l,r,j,mid,sum,lx,rx,ans:longint;
a:array[-..maxn,-..maxn]of extended; function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end; function spfa:boolean;
var head,tail,x,j:longint;
begin
fillchar(vis,sizeof(vis),true);
fillchar(dis,sizeof(dis),);
head:=;tail:=;opt[]:=s;vis[s]:=false;dis[s]:=;
while head<>tail do
begin
head:=(head+) mod maxn;
x:=opt[head];j:=link[x];
while j<> do
begin
if (dis[x]+<dis[ter[j]])and(w[j]>) then
begin
dis[ter[j]]:=dis[x]+;
if vis[ter[j]] then
begin
vis[ter[j]]:=false;
tail:=(tail+) mod maxn;
opt[tail]:=ter[j];
end;
end;
j:=next[j];
end;
vis[x]:=true;
end;
if dis[t]<>dis[t+] then exit(true) else exit(false);
end; function dfs(p,sum:longint):longint;
var tem,j,x:longint;
begin
tem:=;
if p=t then exit(sum);
j:=link[p];
while j<> do
begin
if (dis[ter[j]]=dis[p]+)and(w[j]>) then
begin
x:=dfs(ter[j],min(sum-tem,w[j]));
inc(tem,x);dec(w[j],x);inc(w[rec[j]],x);
if rec[j]=j+ then inc(flow[fa[j]],x) else dec(flow[fa[rec[j]]],x);
if tem=sum then exit(sum);
end;
j:=next[j];
end;
exit(tem);
end; procedure add(x,y,z:longint);
begin
inc(e);ter[e]:=y;next[e]:=link[x];link[x]:=e;w[e]:=z;rec[e]:=e+;
inc(e);ter[e]:=x;next[e]:=link[y];link[y]:=e;w[e]:=;rec[e]:=e-;
end; function Jud:boolean;
var j:longint;
begin
j:=link[s];
while j<> do
begin
if w[j]> then exit(false);
j:=next[j];
end;
exit(true);
end; function Solve:boolean;
var i,sum:longint;
begin
sum:=;
while spfa do inc(sum,dfs(s,));
if (not Jud) then exit(false) else exit(true);
end; begin
readln(n);ans:=;
for i:= to n do
begin
for j:= to n do begin read(a[i,j]);inc(ans,trunc(a[i,j]));end;
readln;
end;
Lx:=;Rx:=;sum:=-;
while Lx<=Rx do
begin
mid:=(Lx+Rx) >> ;
fillchar(next,sizeof(next),);
fillchar(link,sizeof(link),);
fillchar(inp,sizeof(inp),);
e:=;s:= ;t:=*n+;
for i:= to n- do
begin
l:=trunc(a[i,n]);
if a[i,n]<>l then add(s,i,);
dec(inp[s],l);inc(inp[i],l); l:=trunc(a[n,i]);
if a[n,i]<>l then add(n+i,t,);
dec(inp[n+i],l);inc(inp[t],l);
end;
for i:= to n- do
for j:= to n- do
begin
l:=trunc(a[i,j]);
if a[i,j]<>l then add(i,n+j,);
dec(inp[i],l);inc(inp[n+j],l);
end;
add(t,s,INF);
inc(inp[s],mid);dec(inp[t],mid);
dec(s);inc(t);
for i:=s+ to t- do
if inp[i]> then add(s,i,inp[i]) else
if inp[i]< then add(i,t,-inp[i]);
if Solve then begin sum:=mid;Lx:=mid+ end else Rx:=mid-;
end;
writeln(sum*);
end.

  

[BZOJ3698]XWW的难题解题报告|上下界网络流|有源汇最大流的更多相关文章

  1. Cogs 12. 运输问题2(有上下界的有源汇最大流)

    运输问题2 ★★☆ 输入文件:maxflowb.in 输出文件:maxflowb.out 简单对比 时间限制:1 s 内存限制:128 MB 运输问题 [问题描述] 一个工厂每天生产若干商品,需运输到 ...

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

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

  3. POJ 2396 Budget (上下界网络流有源可行流)

    转载: http://blog.csdn.net/axuan_k/article/details/47297395 题目描述: 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表 ...

  4. SGU 176 【带上下界的有源汇的最小流】

    ---恢复内容开始--- 题意: 给了n个点,m条有向边. 接下来m行,每条边给起点终点与容量,以及一个标记. 标记为1则该边必须满容量,0表示可以在容量范围内任意流. 求: 从源点1号点到终点n号点 ...

  5. bzoj3698 XWW的难题

    题意:给你个n * n的实数矩阵,你需要把它中的每个数上/下取整,并满足如下条件: 每行最后一个数等于前面的和. 每列最后一个数等于前面的和. n行n列的那个元素始终为0,不予考虑. 求满足条件下矩阵 ...

  6. 【有上下界网络流】【ZOJ】2314 Reactor Cooling

    [算法]有上下界网络流-无源汇(循环流) [题解]http://www.cnblogs.com/onioncyc/p/6496532.html //未提交 #include<cstdio> ...

  7. hdu 4940 Destroy Transportation system( 无源汇上下界网络流的可行流推断 )

    题意:有n个点和m条有向边构成的网络.每条边有两个花费: d:毁坏这条边的花费 b:重建一条双向边的花费 寻找这样两个点集,使得点集s到点集t满足 毁坏全部S到T的路径的费用和 > 毁坏全部T到 ...

  8. ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)

    https://nanti.jisuanke.com/t/31447 题意 一个二分图,左边N个点,右边M个点,中间K条边,问你是否可以删掉边使得所有点的度数在[L,R]之间 分析 最大流不太会.. ...

  9. 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流

    最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...

随机推荐

  1. SQL Server 2005 导出包含(insert into)数据的SQL脚本 (使用存储过程) 分类: 数据库

    CREATE PROCEDURE dbo.UspOutputData @tablename sysname AS ) ) ) declare @xtype tinyint declare @name ...

  2. Java日志(二):log4j与XML配置文件

    [Java日志(一):log4j与.properties配置文件]一文列举的几个案例以.properties文件作为log4j的配置文件,本文简单看一下log4j与XML配置文件 (1)XML配置文件 ...

  3. BeyondCompare3 提示许可证密钥已被撤销解决方法

    今天对比文件提示 许可证密钥已被撤销:3281-0350! 找过了几个注册码还是不行. 正确简单的解决方法: 1.找到 BCState.xml 文件 ​ 2.编辑器打开,删除<TCheckFor ...

  4. Qt QLabel 播放GIF动画

    很久以前用过,不过慢慢的不用了,就慢慢的忘记了,今天拾起来,记录一下,以后用的时候可以翻一下 QLabel播放GIF动画其实很简单 第一步,需要包含头文件,Qt播放GIF动画,我使用的是QMovie类 ...

  5. CCF-NOIP-2018 提高组(复赛) 模拟试题(七)

    T1 Adjoin [问题描述] 定义一种合法的\(0-1\)串:串中任何一个数字都与\(1\)相邻.例如长度为$ 3 的 0-1 $串中,\(101\)是非法的,因为两边的\(1\)没有相邻的\(1 ...

  6. weblogic中配置自定义filter和servlet

    情景:最近公司产品要接入其它厂商的单点服务器,本来我是在Tomcat上进行测试,使用的是spring boot 的注解方式@webFilter和@webServlet注解写过滤器和servlet类,启 ...

  7. 10-Mysql数据库----数据的增删改

    本节重点: 插入数据 INSERT 更新数据 UPDATE 删除数据 DELETE 再来回顾一下之前我们练过的一些操作,相信大家都对插入数据.更新数据.删除数据有了全面的认识.那么在mysql中其实最 ...

  8. C++ 学习笔记之——文件操作和文件流

    1. 文件的概念 对于用户来说,常用到的文件有两大类:程序文件和数据文件.而根据文件中数据的组织方式,则可以将文件分为 ASCII 文件和二进制文件. ASCII 文件,又称字符文件或者文本文件,它的 ...

  9. 使用ValueOperations操作redis

    方法 c参数 s说明   void set(K key, V value); key :字段key value:key对应的值  设置一个key和value   void set(K key, V v ...

  10. C - 红与黑

    C - 红与黑 Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others) Problem Descri ...