題意:給出乙個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...