網路流24題 航空路線問題

2022-05-15 09:50:36 字數 3015 閱讀 2598

時空限制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/2

#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;

}

view code

網路流24題 航空路線問題

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

網路流 24 題 航空路線問題

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

網路流24題 航空路線問題

乙個點只能經過一次 拆點,連流量為1,費用為0的邊。最多能經過多少城市 最大費用流。兩個點之間有一條路線 從u 連向v。這種題一般都這樣建邊 需要注意的一點是 第二個測試點它的最佳方案是從1到n然後再到1 所以不能對於每條可行的線路的容量設定成1,這樣的話對於這種情況就無法回來了qwq ifndef...