1. 程式人生 > >洛谷 P2747 [USACO5.4]周遊加拿大Canada Tour

洛谷 P2747 [USACO5.4]周遊加拿大Canada Tour

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