poj 2135 最小費用最大流

2021-06-18 12:12:28 字數 1239 閱讀 8589

題意:給定乙個無向圖,要從1點到n點再返回1點,每條邊最多走一次,問最短需要走多遠。

分析:最小費用最大流,把題意看成是要找兩條無交集的從1到n的路線,使距離和最小。圖中的點和邊就是網路流圖中的點和邊。設定乙個源,接到1點,設定乙個匯,從n點接到匯。為保證無交集,我們把每條邊的流量設定為1,而源發出的流量和匯接收的流量均為2。所以要求最大流為2的結果,同時把那條最小費用的可行流找出來 。每條邊的費用就是該邊在原圖中的權值。

注意:有重邊,所以要用鄰接表。因為是無向圖,所以要在加邊時,原圖中的一條邊要變成網路流圖中的兩條邊(如果把反向負權費用邊也算上就總共4條邊)。

由於最短路演算法是最小費用最大流演算法的子演算法,所以有些最短路的題可能要用到最小費用最大流

1 #include

#include

#include

#include

using namespace std;

int sumflow;

const int maxn = 1010;

const int maxm = 1000200;

const int inf = 1000000000;

struct edge

edge[maxm<<2];

int ne;

int head[maxn], dist[maxn], pp[maxn];

bool vis[maxn];

void init()

void addedge(int u,int v,int cap,int cost)         //鄰接表

bool spfa(int s,int t,int n)               //spfa求殘留網路的最短路}}

}if(dist[t]==inf)                  //若找不到最短路 ;

return false;

return true;

}int mcmf(int s,int t,int n)              //修改調整網路

sumflow=flow;                 // 最大流  ,只是順便求,這題不需要。

return mincost;

}int main()

addedge(s,1,2,0);

addedge(n,t,2,0);

int ans=mcmf(s,t,t+1);

printf("%d\n",ans);

}return 0;

}112

poj 2135 最小費用最大流

題意是正向走一次反向走一次,每條路只能走一次,問走最少距離是多少。解題方法 每條路流量為1,費用為距離,建立乙個超級源與超級匯流量為2,費用為0,將超級源連線至點1上,超級匯連線至點n上,這樣求1次最大流就能出來正反兩次走法了,就不用反圖去找了。因為為無向圖,所以每條路建兩次邊,正向一次反向一次。i...

poj 2135 最小費用最大流

思路 把路長看作費用,然後如果u,v之間有邊,就連u v,v u,邊容量為1,表示每條邊只能走一次,最後就是源點與1連邊,容量為2,費用為0,n與匯點連邊,容量為2,費用為0,表示增廣2次。這樣就轉化為為最小費用最大流問題來求解了。1 include2 include3 include4 inclu...

POJ 2135 最大流最小費用

題目大意 給定一張無向圖,可能有重邊,n個城市,m條路,問乙個人從1到n再回到1並且不能走過痛一條路兩次,問最小費用是多少 題目解析 構圖,源 容量為2,費用為0 城市 容量為一,費用為cost 匯 容量為2,費用為1 ac include include include include inclu...