算法题(行程排序)

151 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}