首页 > 其他分享 >Codeforces Round 866 (Div. 1) C. The Fox and the Complete Tree Traversal (构造)

Codeforces Round 866 (Div. 1) C. The Fox and the Complete Tree Traversal (构造)

时间:2023-04-27 11:23:47浏览次数:48  
标签:std Complete int Tree Fox fa depth now id

传送门

题目大意:

  给定一个有n个点的树,我们可以任意选择一个点作为起点,这个点可以跳到跟自己距离为1或者距离为2的点,已经到达的点不能再到达(最终必须回到起点),询问是否存在一种方案可以从一个点出发经过所有的点最终再回到这个点来。

  输入一个整数n。紧接着输入n-1条边。

大致思路:

  我们会发现我们在走一个树链的时候,如果树链上挂着一个深度大于等于2的点就会无解,所以我看考虑找到一个最长的树链,也就是树的直径。我们可以发现这么一个构造方案:找到树的直径,然后从一端往另一端走,每次跳到奇数点回来的时候走偶数点,最终回到起点。我们会发现如果树的直径上挂了一个深度大于等于二的点就会无解。否则一定有解。对于树直径上挂的深度为1的点就是去的时候把偶数点的所有子树跳完再去偶数点,回来的时候把奇数点的子树跳完再去偶数点回到起点即可。

#include <bits/stdc++.h>

const int N = 2e5 + 10;
const int M = 1e5 + 10;
const int INF = 0x3f3f3f3f;
typedef long long ll;
typedef std::pair<int, int> PII;
int n, m;

int h[N], ne[N << 1], e[N << 1], idx;
int fa[N], nxt[N];

inline void add(int a, int b) {
	ne[idx] = h[a], e[idx] = b, h[a] = idx ++;
}

int dep[N], mx, id;
bool used[N];
bool vis[N];

bool ok = true;

inline void dfs1(int u, int father, int depth) {
	dep[u] = depth;
	for (int i = h[u]; ~i; i = ne[i]) {
		int j = e[i];
		if (j == father)	continue;
		dfs1(j, u, depth + 1);
	}
	
	if (depth > mx) {
		mx = depth;
		id = u;
	}
}

inline void dfs2(int u, int father, int depth) {
	dep[u] = depth;
	fa[u] = father;

	for (int i = h[u]; ~i; i = ne[i]) {
		int j = e[i];
		if (j == father) continue;
		dfs2(j, u, depth + 1);
	}
	
	if (depth > mx) {
		mx = depth;
		id = u;
	}
}

inline bool dfs(int u, int fa, int sz) {
	if (sz == 2)	return false;
	for (int i = h[u]; ~i; i = ne[i]) {
		int j = e[i];
		if (j == fa || vis[j]) continue;
		if (!dfs(j, u, sz + 1))	return false;
	}
	return true;
}

inline void solve(){
	std::cin >> n;
	memset(h, -1, sizeof h);
	for (int i = 0; i < n - 1; i ++) {
		int a, b;
		std::cin >> a >> b;
		a --, b --;
		add(a, b);
		add(b, a);
	}
	
	dfs1(0, -1, 1);
	int id1 = id;
	id = mx = 0;

	dfs2(id1, -1, 1);
		
	int now = id, last = id;
	while (now != -1) {
		vis[now] = true;
		if  (fa[now] != -1)
		nxt[fa[now]] = now;
		if (fa[now] == -1)	last = now;
		now = fa[now];
	}
	
	for (int i = id; ~i; i = fa[i]) {
		if (!dfs(i, -1, 0)) {
			std::cout << "No" << '\n';
			return ;
		}
	}
	
	std::vector<int> ans;
	
	auto get = [&](int u) -> void {
		for (int i = h[u]; ~i; i = ne[i]) {
			int j = e[i];
			if (vis[j])	continue;
			if (used[j]) continue;
			ans.push_back(j);
			used[j] = true;
		}
	};
	
	std::cout << "Yes" << '\n';
	for (int i = id; ~i; i = fa[i]) {
		used[i] = true;
		ans.push_back(i);
		i = fa[i];
		get(i);
		if (i == -1)	break;
	}
	
	 for (int i = last; i != id; i = nxt[i]) {
	 	get(i);
	 	if (!used[i]) ans.push_back(i);
	 }
	 get(id);
	
	for (auto &v: ans)	std::cout << v + 1<< ' ';
	std::cout << '\n';
}

int main(void) {
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
	
	int _;
	_ = 1;
	//std::cin >> _;
	
	while (_ --) solve();
	
	return 0;
}

标签:std,Complete,int,Tree,Fox,fa,depth,now,id
From: https://www.cnblogs.com/qdhys/p/17358435.html

相关文章

  • 关于vcpkg中x-history命令移除后及git subtree的使用问答
    1、现在的版本中已经移除了x-history命令,我该使用什么方式来查看port的历史记录呢如果当前版本的vcpkg中已经移除了x-history命令,您可以使用以下方法查看port的历史记录:使用Git命令:首先,确保您已经安装了Git。然后,在命令行或终端中,导航到vcpkg的安装目录。接下来,使用以下命令......
  • Apifox-Postman 请求前登录
    请求后端接口进行测试时,往往需要先登录,在Apifox中可以用“前置脚本”来完成登录操作,每次发请求测试接口前,都先调用“前置脚本”完成登录。下面是一个例子(更多信息可参考登录态(Auth)如何处理),代码流程:在环境变量中获取LOGIN_USERNAME和LOGIN_PASSWORD变量的值(用户名和密码——需......
  • VS-tree检索过程
    根据编码后的边标签和节点标签,来不断筛选不符合的情况。......
  • SegmentTree
    线段树SegmentTree功能:计算子数组累加和支持区间修改,新增publicclassSegmentTree{intMAX;int[]arr;int[]sum;int[]lazy;int[]change;boolean[]update;publicSegmentTree(int[]origin){this.MAX=origin.length+......
  • el-tree筛选时不过滤非目标项
    效果图:案例element给的api是一个遍历整个树元素的方法:value为搜索值,可用$refs.tree.filter(value)来传递该参数,一般配合input组件使用;data为该节点的内容。这里的data包括一开始构建树时的自定义参数(非children、id、label等props);node为节点本身,能够获取节点的一些属性,譬......
  • IndexTree
    IndexTree树状数组功能:计算子数组累加和,支持单点变动publicclassIndexTree{intN;int[]arr;publicIndexTree(intN){this.N=N+1;arr=newint[N+1];}//在原始数组index位置的值+numpublicintadd(intindex,......
  • el-tree 根据多个结果筛选树状图
    右侧搜索根据条件查找到对应人,人再查询到对应部门。<template><divclass="contact_tree"><el-inputv-model="filterText"size="small"placeholder="名称和电话过滤"clearable/><el-treeclass="contact_t......
  • echarts treemap当份额太小时文字显示不全,解决为垂直显示全部文字
    before:after:解决: ......
  • npm i 报错 unable to resolve dependency tree
    错误:问题原因:安装包各个版本冲突解决办法:npmi--legacy-peer-deps忽略各种报错命令npmi--legacy-peer-deps--ignore-scripts--registry=https://registry.npm.taobao.org然后重新安装 npminstall 或者 cnpmi ......
  • zTree取消父子关联
    对于zTree父子关联关系的设置,zTree里面自带了一个chkboxType函数。取消父子关联,只需要在初始化树的时候,在settings里面设置:check:{enable:true,chkboxType:{"Y":"","N":""}}即可。附上函数的参数说明:chkboxType:{“Y”:......