在最大流網路中,每條邊只有乙個限制條件,例如容量,頻寬等,這是「最小性引數」,現在加上乙個新的限制條件,例如費用,這是「可加性引數」。在兩個限制條件的基礎上就引出了最小費用最大流的問題:當流量為f時求費用最小的流;如果沒有指定f,就是求最大流時的最小費用。一般的思路就是從零流開始,每次增加乙個最小費用路徑,經過多次增廣,直到無法再增加路徑,就得到了最大流,一般最短路徑的尋找都是用spfa,因為在構建成的網路中是有負邊權的。spfa+最大流=最小費用最大流。
關於最短路,其實最短路就是費用流的一種特例,單源最短路問題就是費用流將邊的容量設定為1,cost設定為路徑長度。在新增乙個源點src,src到起點的變容量設定為1,cost設定為0,那麼s到終點的最小費用最大流就是單源最短路徑的解。這裡設定邊容量為1就是想讓這條邊只經過一次,事實上這是在最短路中本來就只能經過一次。
最小費用最大流中反向邊的邊權設定為0,但是他的費用是-cost,就相當於最大流中的反向邊值一樣,反向邊就相當於將原來已經流過的流在返回回去,相當於這條支路沒有流通過,但是費用邊的反向邊就相當於這個邊的cost沒有花費,所以邊權值是負的,相當於將原來已經算入的cost再減去。
本題的題目環境是這樣的,有一張無向圖,起點是1,終點是n,每條邊都是有邊權的,問存不存在兩條從起點到終點的道路,使得總路程是最小的,但是兩條道路沒有重合。其實就是乙個確定流量的最小費用問題,因為每條邊用過就不能再用,這和最大流的流量等於乙個邊的容量之後這條邊就不能使用本質上是一樣的,再結合邊的權值,我們就知道這是乙個最小費用確定流問題。只要建超級源和超級匯,並且流量為2就可以。注意超級源和起點之間的邊的容量是2,花費是0,終點與超級匯之間的容量是2,花費是0。題目中保證流為2的時候一定存在兩條路。
在我的**中有乙個地方要說明一下:乙個是儲存的方式,用領接表存邊,並且在邊的結構體中就設定了(u,v)的反向邊在e[v]容器中的編號,這樣在查詢增廣路上的流量的時候就很方便了,對於更新殘餘網路也是十分的簡潔。
**如下:
1 #include2 #include3 #include4 #include5using
namespace
std;
6const
int maxn =1005;7
#define inf 0x3f3f3f3f
8int
dis[maxn],pre[maxn],preve[maxn];
9int
n,m;
10struct
edge
13};
14 vectore[maxn];//
領接表存邊,e[i]存第i個結點連線的所有的邊
15void addedge(int
from,int to,int cost,int capacity)//
乙個有向邊分成兩個 16
20bool spfa(int s,int t,int cnt)//
基本就是spfa板尋找一條最短增廣路
2129 dis[s]=0
;30 queueq;
31q.push(s);
32while(!q.empty())33
53}54}
55}56}
57return dis[t]!=inf; 58}
59int mincost(int s,int t,int cnt)//
cnt是傳的點的數量 ,與最大流的更新過程基本完全相同
6071 v=t;
72while(pre[v]!=-1)//
更新殘餘網路
7379 cost+=dis[t]*flow;//
費用累加,如果程式需要輸出最大流,可以再累加flow 80}
81return
cost; 82}
83int
main()
8495
int s=n+1,t=n+2;//
設定超級源和超級匯
96 addedge(s,1,0,2
);97 addedge(n,t,0,2);//
確定最大流量就是2,就是在確定流量條件下的最小費用問題
98 printf("
%d\n
",mincost(s,t,n+2));//
點數加上兩個之後變成n+2 99}
100 }
POJ 2135 Farm Tour 最小費用流
若不是看了題目分類,很難想到這題和網路流掛上鉤,乍一看是求2遍最短路,但是很明顯求最短路可能是錯誤的。題意 fj 又是他 想帶朋友參觀自己的農場,農場有n個點,m條邊,要從1點到n點,再從n點走回來,且2次不能走相同的路,問最小的花費時間。題解 費用流,最小費用即為答案 我的構圖方法 定義源點和匯點...
poj2135Farm Tour 最小費用最大流
題目要求從1到n走一遍再從n到1走一遍而且有重邊,相當於從1到n走兩邊 所以加乙個源點0 1,費用為0,流量為2 加乙個匯點n 1 n,費用為0,流量為2 中間的邊流量為1 只走一遍 費用為c 然後一遍0 n 1的費用流 要注意是無向圖,所以乙個輸入有4條邊 a b c,1 b a c,0 b a ...
POJ 2135 Farm Tour 最小費用流
題意 n個點,m條邊,從1號點出發到n號點,再走回來,且不能走走過的路,求最小路徑權和 最小費用流,用流量為1 限制每條邊只能走一次,建立超源匯點,源點連1號點的流量為2,費用0,匯點同理。其他邊的流量為1,費用為權值。建立超源匯點且權值為2目的是因為起終點經過2次 雖然這裡是點經過2次而題目是邊 ...