題意:給定一張航空圖,圖中頂點代表城市,邊代表 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 次。對於給定的航空圖,試設計乙個...