持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情。
题目描述
玛丽需要从某地飞往另一目的地,由于没有直达飞机,所以需要在中途转很多航班。
例如:SFO -> DFW DFW -> JFK JFK -> MIA MIA -> ORD。
显然旅途中不可能到同一中转城市两次或以上,因为这没有意义。
不幸的是,她将自己的机票的顺序搞乱了,将机票按乘坐顺序整理好对她来说不是一件容易的事。
请你帮助玛丽整理机票,使机票按正确顺序排列。
输入格式
第一行包含整数 TT,表示共有 TT 组测试数据。
每组数据第一行包含整数 NN。
接下来 2N2N 行,每 22 行一组,表示一张机票的信息,每行包含一个字符串,其中第一行表示出发地,第二行表示目的地。
输出格式
每组数据输出一个结果,每个结果占一行。
结果表示为 Case #x: y,其中 xx 是组别编号(从 11 开始),yy 是表示实际行程的机票列表,行程中的每个航段应以 source-destination 的形式输出,航段之间用空格隔开。
数据范围
1≤T≤1001≤T≤100, 1≤N≤10001≤N≤1000
输入样例:
2
1
SFO
DFW
4
MIA
ORD
DFW
JFK
SFO
DFW
JFK
MIA
输出样例:
Case #1: SFO-DFW
Case #2: SFO-DFW DFW-JFK JFK-MIA MIA-ORD
思路
旅途中不可能到同一中转城市两次或以上,所以每一个起点站对应唯一终点 也就是说整个旅程的路线是线性的,不存在一个起点多个终点,或者一个终点多个起点的情况
只要我们找到起点就可以找到整个路程,根据常识,没有哪个点的下一站是起点 我们可以把每一组的起点都放在vector的数组里,并用哈希表标记终点, 我们知道根据线性关系,除了起点,其他的点都是某一点的终点, 所以vector里有且只有一个没被标记的点,那就是全程的起点
每一个点的下一个点我们同样也可以用哈希表存储,最后就可以直接实现链式的查找
代码
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
const int N = 2010;
int t,n;
unordered_map<string, string> ne; // 用来记录sourse的下一站destination
unordered_map<string, bool> des; // 当前站点是某个站点的终点
vector<string> VS;
int main()
{
cin >> t;
string s, d;
for (int q = 1 ; q <= t ; q ++)
{
des.clear();
ne.clear();
VS.clear();
// 一定记得要先清空
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> s >> d;
ne[s] = d; // 起点站s的终点站是d
des[d] = true; // d是终点站
VS.push_back(s); // 把所有的起点站放在vector里,里面一定有全路程的起点站
}
string source; // 全路程的起点
for (auto a : VS) // 遍历VS
{
// 如果当前的站点是某个站点的终点就continue
if (des[a]) continue;
// 此时的a是全程的起点
source = a;
break;
}
printf("Case #%d: ", q);
while (ne[source] != "") //终点没有下一站
{
cout << source << "-" << ne[source] << " ";
source = ne[source];
}
cout << endl;
}
return 0;
}