План курса / Все задачи / Алгоритмы и структуры данных
Маршрут туриста
легко
# решено
Дан набор пар городов tickets, где tickets[i] = [город отправления, город прибытия] в которых побывал турист. Нужно восстановить маршрут следования туриста.
Известно, что все города относятся к одному путешествию, и что каждый следующий перелёт турист начинал из того города, в котором закончил предыдущий и никакой город не был посещён туристом дважды.
public class Solution
{
public static List<string> Route(List<List<string>> strs)
{
// destinationCities - множество городов, куда прибывал турист
var destinationCities = new HashSet<string>();
// mapping - словарь, где ключ: город отправления, значение: город прибытия
var mapping = new Dictionary<string, string>();
foreach (var ticket in strs)
{
destinationCities.Add(ticket[1]);
mapping[ticket[0]] = ticket[1];
}
// Ищем начальный город: он не должен быть пунктом прибытия
string startCity = null;
foreach (var ticket in strs)
{
if (!destinationCities.Contains(ticket[0]))
{
startCity = ticket[0];
break;
}
}
// Восстанавливаем маршрут начиная с startCity
var result = new List<string> { startCity };
for (int i = 0; i < strs.Count; i++)
{
result.Add(mapping[result[^1]]);
}
return result;
}
}
#include <vector>
#include <string>
#include <unordered_map>
#include <unordered_set>
using namespace std;
vector<string> route(const vector<vector<string>>& tickets) {
// destination_cities - сет городов, куда прибывал турист
unordered_set<string> destinationCities;
// ключ: город отправления, значение: город прибытия
unordered_map<string, string> mapping;
for (const auto& ticket : tickets) {
destinationCities.insert(ticket[1]);
mapping[ticket[0]] = ticket[1];
}
// ищем город из которого было отправление
// этот город ни разу не должен упоминаться как
// пункт прибытия
string startCity = "";
for (const auto& ticket : tickets) {
if (destinationCities.find(ticket[0]) == destinationCities.end()) {
startCity = ticket[0];
break;
}
}
// начиная со start_city восстанавливаем маршрут
vector<string> result = {startCity};
for (int i = 0; i < tickets.size(); ++i) {
result.push_back(mapping[result.back()]);
}
return result;
}
package main
func route(tickets [][]string) []string {
// destination_cities - сет городов, куда прибывал турист
destinationCities := make(map[string]struct{})
// ключ: город отправления, значение: город прибытия
mapping := make(map[string]string)
for _, ticket := range tickets {
destinationCities[ticket[1]] = struct{}{}
mapping[ticket[0]] = ticket[1]
}
// ищем город из которого было отправление
// этот город ни разу не должен упоминаться как
// пункт прибытия
startCity := ""
for _, ticket := range tickets {
if _, found := destinationCities[ticket[0]]; !found {
startCity = ticket[0]
break
}
}
// начиная со start_city восстанавливаем маршрут
result := []string{startCity}
for i := 0; i < len(tickets); i++ {
result = append(result, mapping[result[len(result)-1]])
}
return result
}
import java.util.*;
public class Solution {
public List<String> route(List<List<String>> tickets) {
// destination_cities - сет городов, куда прибывал турист
Set<String> destinationCities = new HashSet<>();
// ключ: город отправления, значение: город прибытия
Map<String, String> mapping = new HashMap<>();
for (List<String> ticket : tickets) {
destinationCities.add(ticket.get(1));
mapping.put(ticket.get(0), ticket.get(1));
}
// ищем город из которого было отправление
// этот город ни разу не должен упоминаться как
// пункт прибытия
String startCity = "";
for (List<String> ticket : tickets) {
if (!destinationCities.contains(ticket.get(0))) {
startCity = ticket.get(0);
break;
}
}
// начиная со start_city восстанавливаем маршрут
List<String> result = new ArrayList<>();
result.add(startCity);
for (int i = 0; i < tickets.size(); i++) {
result.add(mapping.get(result.get(result.size() - 1)));
}
return result;
}
}
from typing import *
def route(tickets: List[List[str]]) -> List[str]:
# destination_cities - сет городов, куда прибывал турист
destination_cities = set()
# ключ: город отправления, значение: город прибытия
mapping = {}
for ticket in tickets:
destination_cities.add(ticket[1])
mapping[ticket[0]] = ticket[1]
# ищем город из которого было отправление
# этот город ни разу не должен упоминяться как
# пункт прибытия
start_city = ""
for ticket in tickets:
if ticket[0] not in destination_cities:
start_city = ticket[0]
break
# начиная со start_city восстанавливаем маршрут
result = [start_city]
for _ in range(len(tickets)):
result.append(mapping[result[-1]])
return result
export function route(tickets) {
// destinationCities - сет городов, куда прибывал турист
const destinationCities = new Set();
// ключ: город отправления, значение: город прибытия
const mapping = {};
for (const ticket of tickets) {
destinationCities.add(ticket[1]);
mapping[ticket[0]] = ticket[1];
}
// ищем город из которого было отправление
// этот город ни разу не должен упоминяться как
// пункт прибытия
let startCity = "";
for (const ticket of tickets) {
if (!destinationCities.has(ticket[0])) {
startCity = ticket[0];
break;
}
}
// начиная со start_city восстанавливаем маршрут
const result = [startCity];
for (let i = 0; i < tickets.length; i++) {
result.push(mapping[result[result.length - 1]]);
}
return result;
}