/* Name:poj 1394 Railroad Author:Unimen Date: 02/05/11 16:51 Description:Floyd最短路径 */ /* 解题报告: 1、老方法先将城市编号:用map的方法 2、构建每列火车的邻接矩阵 3、通过火车的邻接矩阵解题 4、方法:将问题分为两部分想 1、在满足的时间后出发,最早到达目的地的时间 2、在满足1的情况下,搜索最晚的出发时间 实现:一个正搜,一个反搜即可,用Floyd */ #include <iostream> #include <cstring> #include <map> #include <string> #include <iomanip> using namespace std; const int MAXN = 1010; struct Train { int time; int city; }change[MAXN][110]; map<string, int> CityNo; int train[MAXN]; int c, t, start, finish, possible;//possible:出发时间 int anTime[110]; void search() { int i, j, k; //搜索在要求的时间后出发,最早能到达目的地的时间 for(i=1; i<=c; ++i) anTime[i] = 1000001; anTime[start] = possible; for(k=1; k<=c; ++k) { for(i=1; i<=t; ++i) { for(j=1; j<train[i]; ++j) { if(change[i][j].time>=anTime[change[i][j].city] && anTime[change[i][j+1].city]>change[i][j+1].time) anTime[change[i][j+1].city] = change[i][j+1].time; } } } //搜索在最早时间到达的前提下,最晚的出发时间 for(i=1; i<=c; ++i) { if(i!=finish) anTime[i] = -1; } for(k=1; k<=c; ++k) { for(i=1; i<=t; ++i) { for(j=1; j<train[i]; ++j) { if(change[i][j+1].time<=anTime[change[i][j+1].city] && anTime[change[i][j].city]<change[i][j].time) anTime[change[i][j].city] = change[i][j].time; } } } } int main() { int i, j, nCase = 1; while(cin>>c && c) { //给城市编号,从1开始 for(i=1; i<=c; ++i) { string szCity; cin>>szCity; CityNo[szCity] = i; } //建立火车的临街矩阵 cin>>t; for(i=1; i<=t; ++i) { int nNo; cin>>nNo; train[i] = nNo; //存放每列火车的换站次数 for(j=1; j<=nNo; ++j) { int nTime; string szCity; cin>>nTime>>szCity; change[i][j].time = nTime; change[i][j].city = CityNo[szCity]; } } cin>>possible; string szStart, szFinish; cin>>szStart>>szFinish; start = CityNo[szStart]; finish = CityNo[szFinish]; search(); if(anTime[finish] == 1000001) { cout<<"Scenario #"<<nCase++<<endl <<"No connection"<<endl<<endl; } else { cout<<"Scenario #"<<nCase++<<endl <<"Departure "<<setw(4)<<setfill('0')<<anTime[start]<<" "<<szStart<<endl <<"Arrival "<<setw(4)<<anTime[finish]<<" "<<szFinish<<endl<<endl; } CityNo.clear(); } return 0; }