poj 2135 最小費用最大流

2021-09-06 11:41:12 字數 1177 閱讀 1281

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

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7#define maxn 1010

8#define maxm 88888

9#define inf 1<<30

1011

struct

edgeedge[maxm];

1415

intn,m,ne,vs,vt;

16int

head[maxn];

1718

void insert(int u,int v,int cap,int

cost)

1932

33bool

mark[maxn];

34int

dist[maxn];

35int

pre[maxn],cur[maxn];

3637

38bool spfa(int vs,int

vt)3961}

62}63}

64return dist[vt]

6667

68int mincostflow(int vs,int

vt)69

76 flow+=aug,cost+=dist[vt]*aug;

77for(int u=vt;u!=vs;u=pre[u])81}

82return

cost;83}

8485

86int

main()

8798 insert(vs,1,2,0

);99 insert(n,vt,2,0

);100

int ans=mincostflow(vs,vt);

101 printf("

%d\n

",ans);

102}

103return0;

104 }

view code

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...