题目链接

按套路行列作为两部分,连边 \(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. openstack项目【day23】:虚拟化介绍

    本节内容 一 什么是虚拟化 二 为何要学习虚拟化 三 虚拟化技术主要分类(了解) 四 平台虚拟化技术又可以细分(了解) 一 什么是虚拟化 虚拟化说白了就是本来是一个完整的资源,切分或者说虚拟成多份,让 ...

  2. angular.module()参数问题

    var app = angular.module('myApp', []); 第二个参数是依赖的模块,因为这里不需要依赖其它模块,因此为空,但是[]不能省略.

  3. Kafka 温故(三):Kafka的内部机制深入(持久化,分布式,通讯协议)

    一.Kafka的持久化 1.数据持久化:     发现线性的访问磁盘(即:按顺序的访问磁盘),很多时候比随机的内存访问快得多,而且有利于持久化:     传统的使用内存做为磁盘的缓存     Kafk ...

  4. 模拟jQuery中的ready方法及实现按需加载css,js

    一.ready函数的实现 经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的源码,涉及到的模块比较多,(水平有限)代码比较难看懂:自己结合 ...

  5. AngularJs -- 模 块

    在JavaScript中,将函数代码全部定义在全局命名空间中绝对不是什么好主意,这样做会导致冲突从而是调试变得非常困难,浪费宝贵的时间. 上一章介绍数据绑定时,就是写在全局命名空间中定义的函数. 在A ...

  6. 【51Nod】1920 空间统计学 状压DP

    [题目]1920 空间统计学 [题意]给定m维空间中的n个点坐标,满足每一维坐标大小都在[0,3]之间,现在对于[0,3*m]的每个数字x统计曼哈顿距离为x的有序点对数.\(n \leq 2*10^5 ...

  7. BFS的队列

    按老师上课的话来总结,队列变化多端:   普通模板没有代价: 普通队列FIFO 01代价: 双端队列,单调队列 任意代价: 优先队列/堆,最短路SPFA/DIJKSTRA

  8. 第11月第3天 直播 rtmp yuv

    1. LiveVideoCoreSDK AudioUnitRender ==> MicSource::inputCallback ==> GenericAudioMixer::pushBu ...

  9. (A - 整数划分 HYSBZ - 1263)(数组模拟大数乘法)

    题目链接:https://cn.vjudge.net/problem/HYSBZ-1263 题目大意:中文题目 具体思路:先进了能的拆成3,如果当前剩下的是4,就先不减去3,直接乘4,如果还剩2的话, ...

  10. Linux那些事儿之我是Hub(大结局)挂起自动化【转】

    转自:http://blog.csdn.net/fudan_abc/article/details/1805471 目睹了当今大学校园的素质流氓化,kiss公开化,消费白领化,上课梦游化,逃课普遍化, ...