题目链接

按套路行列作为两部分,连边 \(S->row->column->T\)。

S向代表行的元素连边cap(A[i][n])(容量上下界为上下取整),代表列的元素向T连边cap(A[n][i]),对于每个元素(i,j)由行i向列j连边cap(A[i][j]).

考虑我们建的这张图实际流量是什么,对于 \(S->Row_i->(i,j)->Col_j->T\),设这是x的流量,实际表示A[i][n]多加了x,A[i][j]多加了x,A[n][i]多加了x;

答案要求整个矩阵,所以最后的最大流*3即可。

有源汇上下界不需要再统计每条边的流量下限了,因为有一条T->S的边,在第一次求最大流时所有边的流量下限已经加到反向边S->T上了,所以第二次直接求S->T最大流即可。

//60476kb	92ms
#include <cstdio>
#include <algorithm>
const int N=1e6,M=1e6,INF=0x3f3f3f3f; int n,src,des,dgr[N],Enum,cur[N],H[N],fr[M<<1],to[M<<1],nxt[M<<1],cap[M<<1],lev[N],num[N],q[N],pre[N];
double A[103][103];
bool inq[N]; inline void AddEdge(int u,int v,int w)
{
if(w)
to[++Enum]=v, fr[Enum]=u, nxt[Enum]=H[u], H[u]=Enum, cap[Enum]=w,
to[++Enum]=u, fr[Enum]=v, nxt[Enum]=H[v], H[v]=Enum, cap[Enum]=0;
}
bool BFS()
{
for(int i=0; i<des; ++i) lev[i]=des+1;
q[0]=des, lev[des]=0; int h=0,t=1;
while(h<t)
{
int x=q[h++];
for(int i=H[x]; i; i=nxt[i])
if(lev[to[i]]==des+1 && cap[i^1])
lev[to[i]]=lev[x]+1, q[t++]=to[i];
}
return lev[src]<=des;
}
int Augment()
{
int mn=INF;
for(int i=des; i!=src; i=fr[pre[i]])
mn=std::min(mn,cap[pre[i]]);
for(int i=des; i!=src; i=fr[pre[i]])
cap[pre[i]]-=mn, cap[pre[i]^1]+=mn;
return mn;
}
int ISAP()
{
if(!BFS()) return 0;
for(int i=0; i<=des; ++i) ++num[lev[i]],cur[i]=H[i];
int x=src,res=0;
while(lev[src]<=des)
{
if(x==des) x=src,res+=Augment();
bool can=0;
for(int i=cur[x]; i; i=nxt[i])
if(lev[to[i]]==lev[x]-1 && cap[i])
{
can=1, cur[x]=i, pre[x=to[i]]=i;
break;
}
if(!can)
{
int mn=des;
for(int i=H[x]; i; i=nxt[i])
if(cap[i]) mn=std::min(mn,lev[to[i]]);
if(!--num[lev[x]]) break;
++num[lev[x]=mn+1];
cur[x]=H[x];
if(x!=src) x=fr[pre[x]];
}
}
return res;
} int main()
{
// freopen("1.in","r",stdin);
scanf("%d",&n);
int S=0, T=n<<1|1; Enum=1, src=S, des=T;
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j) scanf("%lf",&A[i][j]);
int res=0;
for(int i=1; i<n; ++i) dgr[src]-=(int)A[i][n],dgr[i]+=(int)A[i][n], AddEdge(src,i,(A[i][n]-(int)A[i][n])>0);
for(int i=1; i<n; ++i) dgr[i+n]-=(int)A[n][i],dgr[des]+=(int)A[n][i], AddEdge(i+n,des,(A[n][i]-(int)A[n][i])>0);
for(int i=1; i<n; ++i)
for(int j=1; j<n; ++j)
dgr[i]-=(int)A[i][j],dgr[j+n]+=(int)A[i][j], AddEdge(i,j+n,(A[i][j]-(int)A[i][j])>0);
int SS=des+1,TT=des+2; src=SS, des=TT;
for(int i=S; i<=T; ++i)
if(dgr[i]>0) dgr[SS]+=dgr[i],AddEdge(SS,i,dgr[i]);
else if(dgr[i]<0) AddEdge(i,TT,-dgr[i]);
AddEdge(T,S,INF);
if(ISAP()==dgr[SS]) src=S,des=T,printf("%d",3*ISAP());
else printf("No"); return 0;
}

BZOJ.3698.XWW的难题(有源汇上下界最大流ISAP)的更多相关文章

  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. BZOJ 2502 清理雪道(有源汇上下界最小流)

    题面 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机, ...

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

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

  5. bzoj 2406: 矩阵【二分+有源汇上下界可行流】

    最大值最小,所以考虑二分 |Σaij-Σbij|<=mid,所以Σbij的上下界就是(Σaij-mid,Σaij+mid) 考虑建有上下界网络,连接(s,i,Σaik-mid,Σaik+mid) ...

  6. bzoj 2502 清理雪道 (有源汇上下界最小流)

    2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MB Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场 ...

  7. BZOJ 2406 矩阵(二分+有源汇上下界可行流)

    题意 题解 二分答案+可行流判断. 模板题. CODE #include <cstdio> #include <cstring> #include <algorithm& ...

  8. 【有源汇上下界费用流】BZOJ 3876 [Ahoi2014]支线剧情

    题目链接: http://www.lydsy.com:808/JudgeOnline/problem.php?id=3876 题目大意: 给定一张拓扑图(有向无环图),每条边有边权,每次只能从第一个点 ...

  9. BZOJ 2502 清理雪道/ Luogu P4843 清理雪道 (有源汇上下界最小流)

    题意 有一个有向无环图,求最少的路径条数覆盖所有的边 分析 有源汇上下界最小流板题,直接放代码了,不会的看dalao博客:liu_runda 有点长,讲的很好,静心看一定能看懂 CODE #inclu ...

随机推荐

  1. 流媒体服务器之————EasyDarwin开源流媒体服务器:编译、配置、部署

    源码下载地址:https://github.com/EasyDarwin/EasyDarwin/archive/v7.0.5.zip 查看 Ubuntu 的版本号 sudo lsb_release - ...

  2. Logistic Regression – Geometric Intuition

    Logistic Regression – Geometric Intuition Everybody who has taken a machine learning course probably ...

  3. Git 操作指南

    http://blog.csdn.net/troy__/article/details/40082657

  4. [转载]AngularJS视图

    http://www.yiibai.com/angularjs/angularjs_views.html <html> <head> <title>Angular ...

  5. CSS marging相关

    一.margin可以为负值 在盒模型中,内容区的width/height.padding.border都不能为负值,但是margin例外,它可以为负值. margin负值的本质,在于它改变了元素在普通 ...

  6. 谁在call我-backtrace的实现原理【转】

    转自:http://www.xuebuyuan.com/1504689.html 显示函数调用关系(backtrace/callstack)是调试器必备的功能之一,比如在gdb里,用bt命令就可以查看 ...

  7. Linux常见问题总结【转】

    作为一名合格的 Linux 运维工程师,一定要有一套清晰.明确的解决故障思路,当问题出现时,才能迅速定位.解决问题,这里给出一个处理问题的一般思路: 重视报错提示信息:每个错误的出现,都是给出错误提示 ...

  8. 推荐一些socket工具,TCP、UDP调试、抓包工具 (转载)

    还记得我在很久很久以前和大家推荐的Fiddler和Charles debugger么?他们都是HTTP的神器级调试工具,非常非常的好用.好工具能让你事半功倍,基本上,我是属于彻头彻尾的工具控. 假如有 ...

  9. pixel像素基础

    地址:http://www.imooc.com/video/9564 dp(安卓),pt(iphone)是物理像素 ppi是由物理像素确定的 一英寸内有多少个像素渲染,ppi越高,图片越清晰 1px ...

  10. 深入理解java虚拟机-00

    这本书买了有两年了,只有买回来翻了两页...今天电脑有点卡,游戏玩不了了,就来看看这本书. 首先看了序言,这本书是第二版,讲解的jdk版本是1.7,现在公司用的1.8,而且1.8的改动也挺大的,不过在 ...