CF29C解题报告
CF29C 解题报告
题意
有一封邮件,经过了 \(n\) 个城市,每个城市会盖上一个邮戳,代表从城市 \(u\) 向城市 \(v\) 发送一个邮件。
保证不会经过重复的城市,并且确定只有两条路线。
题目有 Special Judge。
分析
从题意中确定只有两条路线且不经过重复的城市可得,邮票经过的城市可以看作一条链。
对于一条链,只需要确定一个起点,那么整个链都可以被遍历出来。因此,题目被转化成了求一条链的起点。
易得,一条链的起点只有一条边连着,在通过邻接表存完图后,直接遍历每一个点看是否只连了一条边就好了。
注意:此题点的编号巨大,高达 \(1\times 10^9\),不能用传统的邻接表,需要用 map 去套一个 vector 记录每一个点的信息。
最后跑一遍 dfs,从起点开始,边遍历边输出。
代码
#include <bits/stdc++.h>
using namespace std;
int n;
map<int, vector<int>> g;//用 map 套 vector
void dfs(int x, int fa){//因为是一条链,所以只需要记录 father
cout << x << " ";//边遍历输出
for (int i = 0; i < g[x].size(); i++){
int v = g[x][i];
if (v != fa) dfs(v, x);
}
}
int main(){
cin >> n;
for (int i = 1, u, v; i <= n; i++){
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
for (auto it : g){//遍历每一个点
if (it.second.size() == 1){//是否为起点
dfs(it.first, -1);
return 0;
}
}
return 0;
}