給定一張航空圖,圖中頂點代表城市,邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。
(1)從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點(可途經若干城市)。
(2)除起點城市外,任何城市只能訪問 1 次。
對於給定的航空圖,試設計乙個演算法找出一條滿足要求的最佳航空旅行路線。
輸入格式:
第 1 行有 2 個正整數 n 和 v,n 表示城市數,n<100,v 表示直飛航線數。接下來的 n 行中每一行是乙個城市名,可乘飛機訪問這些城市。城市名出現的順序是從西向東。也就是說,設 i,j 是城市表列中城市出現的順序,當 i>j 時,表示城市 i 在城市 j 的東邊,而且不會有 2 個城市在同一條經線上。城市名是乙個長度不超過15 的字串,串中的字元可以是字母或阿拉伯數字。例如,agr34 或 bel4。再接下來的 v 行中,每行有 2 個城市名,中間用空格隔開,如 city1 city2 表示 city1到 city2 有一條直通航線,從 city2 到 city1 也有一條直通航線。
輸出格式:
件第 1 行是旅行路線中所訪問的城市總數 m。接下來的 m+1 行是旅行路線的城市名,每行寫 1 個城市名。首先是出發城市名,然後按訪問順序列出其它城市名。注意,最後 1 行(終點城市)的城市名必然是出發城市名。如果問題無解,則輸出「no solution!」。
輸入樣例#1:
8 9vancouver
yellowknife
edmonton
calgary
winnipeg
toronto
montreal
halifax
vancouver edmonton
vancouver calgary
calgary winnipeg
winnipeg toronto
toronto halifax
montreal halifax
edmonton montreal
edmonton yellowknife
edmonton calgary
輸出樣例#1:
7vancouver
edmonton
montreal
halifax
toronto
winnipeg
calgary
vancouver
感謝 @zhouyonglong 提供spj
辣雞題目,調了一天,qwq。
建圖:首先,將原問題轉換為從1到n找兩條不經過相同點的最長路徑。
由於次數限制,想到拆點。
對於每一條原圖中的邊,變成(i+n,j)的有向邊,最大流即為路徑條數。
最多經過的城市數就是跑費用流的最大費用。
至於記錄路徑,可以dfs搜尋。
注意不能在費用流中記錄,因為有玄學退流操作。
還有不能在原圖中的邊連容量為inf的邊,(不明原因)。
#include#include#include#include#includeusing namespace std;
const int n=105;
const int inf=1e9+7;
int n,m,cnt=1,s,t,sum,ans,res[2][n],dis[2*n],hd[2*n],pre[2*n];
bool inq[2*n],vis[2*n],***;
char ct[n][21];
queueq;
mapmp;
struct edge
v[2*n*n];
void addedge(int x,int y,int z,int w)
void addedges(int x,int y,int z,int w)
bool spfa()
return 0;
}
洛谷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 次。對於給定的航空圖,...
P2770 航空路線問題(最大費用最大流)
題意 給定一張航空圖,圖中頂點代表城市,邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。1 從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點 可途經若干城市 2 除起點城市外,任何城市只能訪問 1 次。對於給定的航空圖,試設...