洛谷 P2747 [USACO5.4]周遊加拿大Canada Tour
阿新 • • 發佈:2017-09-24
data- get 大於 開放 旅行 一場 ++ 第一個 如果
P2747 [USACO5.4]周遊加拿大Canada Tour
題目描述
你贏得了一場航空公司舉辦的比賽,獎品是一張加拿大環遊機票。旅行在這家航空公司開放的最西邊的城市開始,然後一直自西向東旅行,直到你到達最東邊的城市,再由東向西返回,直到你回到開始的城市。除了旅行開始的城市之外,每個城市只能訪問一次,因為開始的城市必定要被訪問兩次(在旅行的開始和結束)。
當然不允許使用其他公司的航線或者用其他的交通工具。
給出這個航空公司開放的城市的列表,和兩兩城市之間的直達航線列表。找出能夠訪問盡可能多的城市的路線,這條路線必須滿足上述條件,也就是從列表中的第一個城市開始旅行,訪問到列表中最後一個城市之後再返回第一個城市。
輸入輸出格式
輸入格式:
第 1 行: 航空公司開放的城市數 N 和將要列出的直達航線的數量 V。N 是一個不大於 100 的正整數。V 是任意的正整數。
第 2..N+1 行: 每行包括一個航空公司開放的城市名稱。城市名稱按照自西向東排列。不會出現兩個城市在同一條經線上的情況。每個城市的名稱都 是一個字符串,最多15字節,由拉丁字母表上的字母組成;城市名稱中沒有空格。
第 N+2..N+2+V-1 行: 每行包括兩個城市名稱(由上面列表中的城市名稱組成),用一個空格分開。這樣就表示兩個城市之間的直達雙程航線。
輸出格式:
Line 1: 按照最佳路線訪問的不同城市的數量 M。如果無法找到路線,輸出 1。
輸入輸出樣例
輸入樣例#1: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
輸出樣例#1:7
說明
題目翻譯來自NOCOW。
USACO Training Section 5.4
#include<map> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; map<string,int>ma; int n,m,tot,ans; char s[210],ss[210]; int f[210][210],dis[210][210]; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%s",s); ma[s]=++tot; } for(int i=1;i<=m;i++){ scanf("%s %s",s,ss); dis[ma[ss]][ma[s]]=dis[ma[s]][ma[ss]]=1; } f[1][1]=1; for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) for(int k=1;k<j;k++) if(dis[j][k]&&f[i][k]&&f[i][k]+1>f[i][j]) f[i][j]=f[j][i]=f[i][k]+1; ans=1; for(int i=1;i<=n;i++) if(dis[i][n]) ans=max(ans,f[i][n]); cout<<ans; }
洛谷 P2747 [USACO5.4]周遊加拿大Canada Tour