時空限制1000ms / 128mb
給定一張航空圖,圖中頂點代表城市,邊代表 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!」。
輸入樣例:
8 9輸出樣例:vancouver
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
7最大權不相交路徑。一開始我沒想到竟然可以看成從左端點開始的兩條不相交路徑,瞎搞了好久。。。vancouver
edmonton
montreal
halifax
toronto
winnipeg
calgary
vancouver
#include#define inf llong_max/2view code#define n 205
using
namespace
std;
structss;
ss edg[n*n];
int head[n],now_edge=0
;void addedge(int u,int v,long
long flow,long
long
cost)
; head[u]=now_edge++;
edg[now_edge]=(ss);
head[v]=now_edge++;
}int spfa(int s,int t,long
long &flow,long
long &cost)
; vis[s]=1
; queue
q;q.push(s);
long
long
dis[n];
for(int i=0;iinf;
dis[s]=0
;
int pre[n]=;
long
long addflow[n]=;
addflow[s]=inf;
while(!q.empty())}}
}if(dis[t]==inf)return0;
flow+=addflow[t];
cost+=addflow[t]*dis[t];
int now=t;
while(now!=s)
return1;
}void mcmf(int s,int t,long
long &flow,long
long &cost)
void
init()
mapmap1;
mapmap2;
vector
ans;
intn;
void dfs(int
x) }
}int
main()
int s=2*n+1,t=s+1
;
while(m--)
for(int i=2;i2-1,i*2,1,1
); addedge(
1,2,2,1
); addedge(
2*n-1,2*n,2,1
); addedge(s,
1,2,0
); addedge(
2*n,t,inf,0
);
long
long flow=0,cost=0
; mcmf(s,t,flow,cost);
if(flow<2
)
printf(
"%lld\n
",-cost-2
);
dfs(1);
cout
<1]<
for(int i=0;iendl;
ans.clear();
dfs(1);
for(int i=ans.size()-2;i>=0;i--)cout
cout
<1]<
return0;
}
網路流24題 航空路線問題
題目描述 給定一張航空圖,圖中頂點代表城市,邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。1 從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點 可途經若干城市 2 除起點城市外,任何城市只能訪問 1 次。從東到西到達乙個點...
網路流 24 題 航空路線問題
題目描述 給定一張航空圖,圖中頂點代表城市,邊代表兩個城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點 可途經若干城市 除起點城市外,任何城市只能訪問一次。對於給定的航空圖,試設計乙個演算...
網路流24題 航空路線問題
乙個點只能經過一次 拆點,連流量為1,費用為0的邊。最多能經過多少城市 最大費用流。兩個點之間有一條路線 從u 連向v。這種題一般都這樣建邊 需要注意的一點是 第二個測試點它的最佳方案是從1到n然後再到1 所以不能對於每條可行的線路的容量設定成1,這樣的話對於這種情況就無法回來了qwq ifndef...