loj模板題 思想是
,如果存
在可行流
,每條邊
必定至少
有下界的
流量
思想是,如果存在可行流,每條邊必定至少有下界的流量
思想是,如果
存在可行
流,每條
邊必定至
少有下界
的流量
那 麼直
接用下屆
填充邊的
流量
那麼直接用下屆填充邊的流量
那麼直接用下
屆填充邊
的流量
每 條邊
的流量就
變成了[
0,up
−dow
n]
每條邊的流量就變成了[0,up-down]
每條邊的流量
就變成了
[0,u
p−do
wn]
此 時有
一些點流
入的流量
大於流出
的流量,
記作in
[i
]<
0此時有一些點流入的流量大於流出的流量,記作in[i]<0
此時有一些點
流入的流
量大於流
出的流量
,記作i
n[i]
<0
有 一些
點流入的
流量小於
流出的流
量,記作
in[i
]>
0有一些點流入的流量小於流出的流量,記作in[i]>0
有一些點流入
的流量小
於流出的
流量,記
作in[
i]>0
對 於i
n[i]
<0的
點,流入
太多,那
麼給匯點
t對於in[i]<0的點,流入太多,那麼給匯點t
對於in[i
]<0的
點,流入
太多,那
麼給匯點
t 對 於i
n[i]
>0的
點,流出
太多,那
麼源點s
提供給它
對於in[i]>0的點,流出太多,那麼源點s提供給它
對於in[i
]>0的
點,流出
太多,那
麼源點s
提供給它這樣
一來,在
新圖上跑
最大流,
最大流會
填充in
[i]等
於0
這樣一來,在新圖上跑最大流,最大流會填充in[i]等於0
這樣一來,在
新圖上跑
最大流,
最大流會
填充in
[i]等
於0 這樣就
得到乙個
可行流,
邊的流量
是下界+
反向邊的
流量
這樣就得到乙個可行流,邊的流量是下界+反向邊的流量
這樣就得到一
個可行流
,邊的流
量是下界
+反向邊
的流量
#include using namespace std;
const int maxn=2e5+10;
const int inf=1e9;
struct edged[maxn]; int head[maxn],cnt=1;
void add(int u,int v,int flow),head[u]=cnt;
d[++cnt]=(edge),head[v]=cnt;
}int n,m,s,t;
int in[maxn],dis[maxn],up[maxn],down[maxn];
bool bfs()
} }return false;
}int dinic(int u,int flow)
} return flow-res;
}int main()
s=0,t=n+1;
int ans=0,sumn=0;
for(int i=1;i<=n;i++)
if( in[i]<0 ) add(i,t,-in[i] );//流入太多,給匯點
else add(s,i,in[i] ),sumn+=in[i];//流出太多,源點補充
while( bfs() ) ans+=dinic(s,inf);
puts( ans==sumn?"yes":"no");
if( ans!=sumn ) return 0;
for(int i=2; i<=m*2+1; i+=2)
cout << d[i^1].flow+down[i/2] << '\n';
}
無源匯有上下界可行流
來自loj的模板題 我們可以依照以下幾個步驟來解決這個問題。1.讓所有的邊都流下界數量的水 2.計算每個點流入的水量 流出的水量d x d x d x 3.建超級源點s ss和超級匯點t tt4.對於每個點,若d x 0d x 0 d x 0則連邊s,x d x s,x,d x 如果d x 0d x...
loj 115 無源匯有上下界可行流
參考部落格 模型 乙個網路,求出乙個流,使得每條邊的流量必須 li且 hi,每個點必須滿足總流入量 總流出量 流量守恆 這個流的特點是迴圈往復,無始無終 這個演算法是有上下界網路流演算法的基礎,只要深刻理解這個演算法其他演算法也就水到渠成,因此我用大篇幅力圖將這個演算法的思想和細節闡述清楚.可行流演...
LOJ 115 無源匯有上下界可行流
模板題 首先把下界去掉 連邊upper lower 然後記錄每個點至少要流出的和流入的流量 下界 然後流入大於流出的連向tt,流出大於流入的連向ss 補流 然後跑最大流,如果sum flow,就代表加上的邊滿流,有答案,否則沒有 include include include include inc...