費用流處理負圈的方法

2022-06-20 14:03:14 字數 961 閱讀 9642

以最小費用最大流為例,我們可以通過退流來消除費用為負數的邊。

具體過程:

不妨設有一條從\(u\)到\(v\)的容量為\(c\)費用為\(d\)的邊(\(d<0\))。

先強制滿流,把答案加上\(c\times\)。

之後,從\(u\)到\(t\),\(s\)到\(v\)各連一條容量為\(c\),費用為0的邊,用來調整流量。這兩條邊要使用手段強制滿流。

最後,連一條從\(v\)到\(u\)的容量為\(c\)費用為\(-d\)的邊,用於退流。

這樣就沒有負環了。

也有解決負環的演算法:

正常,我們的最小費用流的費用都應該是正數。

但是,有時,邊權會出現負數,進而可能出現負圈。

這時,我們可以這樣處理:

在每次增廣時,先在整張圖中找負圈,若能找到,則沿著負圈增廣。

否則,再找增廣路進行增廣。

找負圈使用dfs的spfa會更好寫,更快。

可以優化:

每個點只搜尋一次(見注釋)。

如果搜不到負環了,就不需要再考慮負環了。

**:

bool dfs(int u)

if(dfs(v[i]))

return true;

} }bk[u]=false;

return false;

}bool spfa()

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

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

jl[s]=0;fq=-1;

dfs(s);

return jl[t]}int feiyl(int &fei)

he+=zx;fei+=jl[t]*zx;u=t;

while(u!=s)

}else

u=fq;

while(1)

}} return he;

}

對費用流消負圈的小小理解

上次 參觀 華工校賽,g題 a mincost maxflow problem 引發了對費用流中負權迴路的思考 這題目是單純的模板題,不想再提了 下面說一下消圈 有負權迴路的圖是不可能球出最短路的,所以增廣演算法不能發揮用處,那我們可不可以通過修改權值從而消去負邊?答案當然是肯定的 以下操作的前提是...

poj 2175 費用流 消圈

這道題如果直接費用流會超時。題目只是讓我們判斷是否是最好的情況,我們只需要找到更好的一種情況即可,不需要求最好的。也就是說按照最小費用流的做法,我們只需要在殘餘網路還能找到乙個負圈的即可。這是充分必要條件,如果達到最優解,就沒有負圈了。所以我們按照題意建立圖還有殘餘網路。之後判斷圖中是否存在乙個負圈...

HDOJ1853 費用流 圈,拆點

mcmf和spfa部分直接拷貝 於aoj581 include include include include include using namespace std const int nn 250 const int mm 50000 const int inf 0x3fffffff struc...