【線性規劃與網路流24題 11】航空路線
time limit:10000ms memory limit:65536k
total submit:18 accepted:2
case time limit:1000ms
description
給定一張航空圖,圖中頂點代表城市,邊代表2城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。
(1)從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點(可途經若干城市)。
(2)除起點城市外,任何城市只能訪問1次。
程式設計任務:
對於給定的航空圖,試設計乙個演算法找出一條滿足要求的最佳航空旅行路線。
由於本oj無special judge , 所以只需要輸出最多經過的城市數
input
第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 也有一條直通航線。
output
一行,包含乙個整數或字串,表示最多經過的城市數,如果無解,則輸出"no solution!"(不包含引號)
sample input
8 9sample outputvancouver
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
7source
感謝 wo_ai_wangyuan 修改題目並放上資料
這題要用到最大費用最大流
把問題抽象成圖論問題,數學模型是求從s到t的兩條不相交的路徑,使得路徑上點的權值之和最大。
費用流建模,首先拆點,把頂點x拆成x和x',x 與x'之間連線一條費用為1,容量為1的有向邊;
特殊地,1和n兩個節點拆分後點內邊容量設為2
對於與x相連的點a(a>x)x'向a連一條費用為0,容量為1的邊。
最後再特判一下無解的情況
#include#include#include#include#include#includeusing namespace std;
const int maxn=505,inf=1e9;
string ss,tt;
int n,m,last[maxn],path[maxn],op,ed;
int dis[maxn],vd[maxn],maxflow,mincost;
bool flag[maxn];
mapid;
struct wr
};
vectors;
void insert(int a,int b,int w,int c)
struct wk
bool find(int st,int nd)
}
}
}
return dis[nd]>-inf;
}
}spfa;
void addflow()
}
int main()
for(i=1;i<=m;i++)
while(spfa.find(op,ed))addflow();
if(maxflow==1&&mincost==2) printf("2");
else if(maxflow!=2)printf("no solution!");
else printf("%d",mincost-2);
}
航空路線 題解
一道既可以dp又可以網路流的題 戳首先為了儲存狀態,最容易想到的就是狀態壓縮,但是資料範圍不允許我們壓縮,所以就要換思路。最簡單的,就會想到,我們並不關心狀態是什麼,而關心的是狀態是否合法。我們只要讓當前這個dp是合法的,他的轉移是合法的,他的轉移又不會影響到他已經合法的狀態,那麼這樣就可以了。那麼...
題解 航空路線問題
乙個點有兩種用法,但是只能選一種用,直接把乙個點拆掉並且連一條容量為1的邊就成功限制。將乙個點拆為兩個點,乙個入點乙個出點,入點到出點連一條費用為 inf 的邊,跑費用流,最終答案就是 dfrac 輸出方案隨便弄一下就好了。注意考慮邊界情況!1 n 不連通 費用流不能跑負環。spfa能跑什麼費用流就...
航空路線問題(dp解法)
從左到右給你n個點,有m條邊連線這些點,問從最左邊的點到達最右邊的點再回到最左邊的點最多可以經過幾個點 除了起點外每個點最多只能被經過一次 首先,我們可以把題意轉化成從最左邊的點走兩條不相交的路線到達最右邊的點,且使經過的點最多。標程是最大費用最大流。為了限流,我們把每個點i拆成兩個點xi,yi,x...