有源匯上下界可行流 POJ2396

2022-04-30 05:21:09 字數 1549 閱讀 4356

題意:給出乙個n*m的矩陣的每行和及每列和,還有一些格仔的限制,求一組合法方案。

源點向行,匯點向列,連一條上下界均為和的邊。

對於某格的限制,從它所在行向所在列連其上下界的邊。

求有源匯上下界可行流即可。

具體做法可以從匯點向源點連容量為正無窮的邊,轉成無源匯上下界可行流。

然後可以新建超級源匯,對於一條下界為l,上界為r的邊(x,y),從超級源點向y,x向超級匯點連容量為l的邊,x向y連容量為r-l的邊。

如果那些容量為l的邊沒滿流,則無解。

#include #include 

#include

#include

using

namespace

std;

const

int inf = 0x3f3f3f3f, n = 230, m = 25000

;char op[2

];int q,n,m,c,x,y,z,s,t,s,t,e=1,fr,l[205][25],r[205][25],ans[205][25

],hd[n],nxt[m],to[m],f[m],ch[n];

void add(int x, int y, int

z) void upd(int x, int

y) bool

tel()

return ch[t] != -1;}

int zng(int a, int

b)

if(!r) ch[a] = -1

;

returnr;}

intmain()

else

if(!x)

else

if(!y)

else

upd(x,y);

}if(fr) puts(""

); fr = 1

;

for(int i = 1; i <= n; i++)

for(int j = 1; j <= m; j++)

add(i,j+n,r[i][j]-l[i][j]),add(s,j+n,l[i][j]),add(i,t,l[i][j]);

}while(tel()) while

(zng(s,inf));

for(int i = hd[s]; i; i = nxt[i]) if(f[i])

for(int i = 1; i <= n; i++)

for(int j = hd[i]; j; j =nxt[j])

if(to[j] > n && to[j] <= n+m) ans[i][to[j]-n] = f[j^1

];

for(int i = 1; i <= n; i++)

for(int j = 1; j <= m; j++)

printf(

"%d%c

", ans[i][j]+l[i][j], "

\n"[j==m]);

aa: ;

}return0;

}

有源匯上下界網路流

loj116 給出乙個有源匯點的有向圖。每條邊有最大流量和最小流量。現在需要求出從源點到匯點的最大流可以是多少。上下界可行流 先回顧有源匯上下界可行流乾了些什麼。其實可行流就是找到了一種滿足流量下界的方案。在滿足了流量下界之後,可以發現還有一些殘餘的自由流量 可選可不選 於是我們在之前的殘餘網路上再...

有源匯上下界最小流 模板

這只是 其中一種 做法 這只是其中一種做法 這只是其中一 種做法 我暫時還沒有理解,只是先放個模板而已 首 先還 是根據下 界來建圖 原圖源 點s,匯 點t 首先還是根據下界來建圖,原圖源點s,匯點t 首先還是根據 下界來建 圖,原圖 源點s,匯點t 然 後因 為流量守 恆,新建 超級源s 1和超級...

117 有源匯有上下界最小流

題目描述 n nn 個點,m mm 條邊,每條邊 e ee 有乙個流量下界 lower e text e lower e 和流量上界 upper e text e upper e 給定源點 s ss 與匯點 t tt,求源點到匯點的最小流。輸入格式 第一行兩個正整數 n nn m mm s ss t...