window.cnblogsConfig = {//可以放多张照片,应该是在每一个博文上面的图片,如果是多张的话,那么就随机换的。 homeTopImg: [ "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png", "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png" ], }

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;
}
posted @ 2024-01-18 07:52  CCF_IOI  阅读(22)  评论(0)    收藏  举报