對於乙個網路, 我們可能會有多組最大流, 現在我們給每條邊附上乙個費用係數, 每條邊產生的費用 = 這條邊的流量 × 這條邊的費用係數,常見的問題是求最小費用最大流。
做法非常簡單,每次找一條費用最小的增廣路,並確定這條增廣路上最小的流量,整條增廣路上的弧減去這個流量, 反向弧加上, 直到沒有增廣路為止。
答案是每次的最小流量乘上費用係數的和。
這麼做最大流是一定可以保證的,那為什麼費用會最小呢?
我也不會,某人說:「你聽過最小生成樹克魯斯卡爾演算法嗎?」。
先規定一下要用的東西:
int dis[maxn], d[maxm * 10], bz[maxn], ans; //dis[x]表示從s到x的距離,d是佇列,bz表示在佇列裡。
int tot = 1, final[maxn], last[maxn]; //final是前向星的,last表示這個點是由哪一條弧過來的。
struct edge a[maxm];
void link(int x,int y,int r,int w) //前向星加邊
bool spfa() }}
}return dis[t] != dis[0]; //返回是否有增廣路。
}
void solve()
}}
最小費用流模板(zkw與spfa)
實踐中,上面的這個演算法非常奇怪.在某一些圖上,演算法速度非常快,另一些圖上卻比純 spfa 增廣的演算法慢.不少同學經過實測總結的結果是稠密圖上比較快,稀疏圖上比較慢,但也不盡然.這裡我從理論上分析一下,究竟這個演算法用於哪些圖可以得到理想的效果.先分析演算法的增廣流程.和 spfa 直接演算法相...
費用流模板
const int oo 1e9 無窮 const int mm 11111111 邊 const int mn 888888 點 int node,src,dest,edge int ver mm flow mm cost mm nex mm int head mn dis mn p mn q m...
費用流(模板)
費用流模板 spfa不停找當前從s到t的最小費用路,然後重新整理最大流 這裡把每條邊的cost為0,同樣就可以求最大流,不過有點慢 include include include include include include include include include include incl...