poj 2135 最小費用最大流初步

2022-03-21 02:12:55 字數 1551 閱讀 2044

這個題的意思是農夫約翰要呆人參觀他的農場, 剛開始從1開始走, 走到n後又返回1點, 兩次不能走相同的路, 問農夫約翰走的最短的路是多少??

我們可以用最小mcmf來解決這個問題, 對於圖中的每一條邊, 我們建立了兩條流量為1, 費用為邊權的邊, 再增加乙個源點和乙個匯點, 源點指向1, 流量為2,費用為0, n指向匯點, 流量為2費用為0, 然後求出最小費用即可, **如下:

#include #include 

#include

#include

#include

using

namespace

std;

const

int inf = 0x3f3f3f3f

;const

int maxn = 1000+10

;int n; //

n個頂點

struct edge;

vector

edges;

vector

g[maxn];

int inque[maxn]; //

spfa 需要用到

int d[maxn]; //

當前點到源點的最短路

int p[maxn]; //

連線當前點的弧

int a[maxn]; //

可改進量

void

init()

void add_edge(int

from, int to, int cap, int

cost)

); edges.push_back((edge));

int m =edges.size();

g[from].push_back(m-2

); g[to].push_back(m-1);}

bool spfa(int s, int t, int &flow, long

long &cost)}}

if(d[t] == inf) return

false

; flow +=a[t];

cost += (long

long)a[t] * (long

long

)d[t];

for(int u=t; u!=s; u=edges[p[u]].from

)

return

true;}

int mcmf(int s, int t, long

long &cost)

intn, m;

intmain()

add_edge(

0, 1, 2, 0

); add_edge(n, n+1, 2, 0

);

long

long

cost;

mcmf(

0, n+1

, cost);

printf(

"%lld\n

", cost);

return0;

}

poj 2135 最小費用最大流

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

poj 2135 最小費用最大流

題意 給定乙個無向圖,要從1點到n點再返回1點,每條邊最多走一次,問最短需要走多遠。分析 最小費用最大流,把題意看成是要找兩條無交集的從1到n的路線,使距離和最小。圖中的點和邊就是網路流圖中的點和邊。設定乙個源,接到1點,設定乙個匯,從n點接到匯。為保證無交集,我們把每條邊的流量設定為1,而源發出的...

poj 2135 最小費用最大流

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