P2770 航空路線問題(最大費用最大流)

2021-09-28 21:01:56 字數 1807 閱讀 6108

題意:給定一張航空圖,圖中頂點代表城市,邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。

(1)從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點(可途經若干城市)。

(2)除起點城市外,任何城市只能訪問 1 次。

對於給定的航空圖,試設計乙個演算法找出一條滿足要求的最佳航空旅行路線。

思路:做費用流還是有點少,開始看這道題還以為最大流,後來才想到要求城市最多的路線,是最大費用最大流。

題目要求乙個來回的路線,我們建圖時為了方便考慮,可以從頭到尾求兩次不一樣的路徑,拆點限制每個城市走一次,從s到1建一條容量為2,價值為0的邊,n到t也是。然後i~i+1建容量為1價值為1的邊,u到v建容量1價值0的邊。跑最大費用最大流。

題中還有個坑,若最大流為1的話可能直接走1-n這條邊,特判是否有1-n的航線。

#include

#define ll long long

#define inf 0x3f3f3f3f

using

namespace std;

const

int n =

1e5+10;

int n, m, s, t, h[n]

, cnt, dis[n]

, inq[n]

, pre[n]

, last[n]

, flow[n]

, liu, f, vs[n]

;struct node no[n]

;void

add(

int u,

int v,

int w,

int c)

; h[u]

= cnt++

; no[cnt]

= node

; h[v]

= cnt++;}

intspfa()

}}return dis[t]

!= inf;

}int

mcmf()

ans +

= flow[t]

* dis[t]

; liu +

= flow[t];}

return ans;

}mapint> mp;

string u, v, str[

1010

], ou[

1010];

intmain()

for(

int i =

1; i <= m; i++

)add

(s,1,2

,0),

add(n + n, t,2,

0);int ans =

-mcmf()

-2;if

(f && liu ==1)

if(liu <2)

cout << ans << endl;

int now =

1+ n;

while

(now != n + n)}}

now =

1+ n;

int o =0;

while

(now != n + n)}}

ou[++o]

= str[n]

;for

(int i = o; i >

0; i--

) cout << ou[i]

<< endl;

return0;

}

洛谷P2770 航空路線問題 最大費用最大流

題目描述 給定一張航空圖,圖中頂點代表城市,邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。1 從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點 可途經若干城市 2 除起點城市外,任何城市只能訪問 1 次。對於給定的航空圖,...

洛谷P2770 航空路線問題(費用流)

傳送門 完了這題好厲害 字串什麼的好麻煩 要求從 1 到 n 的路徑,不重複,經過邊數最多 每乙個點拆成兩個,a i,b i 然後 a i 到 b i 連容量為 1 費用為 1 的邊,保證每個點只被選一次 然後 1 和 n 的話要容量為 2 然後有連邊的話,b i 向 a j 連邊,容量 1 費用 ...

洛谷 P2770 航空路線問題

給定一張航空圖,圖中頂點代表城市,邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。1 從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點 可途經若干城市 2 除起點城市外,任何城市只能訪問 1 次。對於給定的航空圖,試設計乙個...