以最小費用最大流為例,我們可以通過退流來消除費用為負數的邊。
具體過程:
不妨設有一條從\(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...