首页 > 其他分享 >CF29D Ant on the Tree

CF29D Ant on the Tree

时间:2024-08-06 12:17:07浏览次数:13  
标签:输出 int Tree 煞笔 样例 CF29D Ant 节点

Ant on the Tree

题面翻译

无环连通无向图称为树。树是一类图,不仅对于人很有趣,而且对蚂蚁也很有趣。

蚂蚁站在树根处。他发现树中有N个顶点,它们由n-1条边连接,因此在任何一对节点之间都有一条路径。叶节点与根节点不同,它只与另一个节点相连。

蚂蚁想要访问树中的每个节点并返回到根,每条边都要经过两次。此外,他想以特定的顺序访问节点。你要找到蚂蚁的可能路线。

输入:

第一行包含整数N(3<=N<=300)代表树中的顶点数量。接下来的N-1行描述边。每个边用两个整数来描述,即它连接的顶点的编号。均为无向边。顶点从1开始编号,1是根节点。最后一行包含k整数,其中k是树中叶子的数量。这些数字描述了叶节点应该被访问的顺序。保证每个叶节点只出现一次。

输出:

如果所需的路径不存在,输出-1。否则,输出2N-1个数字,描述路径。每次蚂蚁到达一个节点时,输出它的编号。


简化:给一棵树,根节点为1,要求以特定顺序遍历这棵树的叶子节点,并顺序输出到达的每一个节点。如果做不到,输出-1

题目描述

Connected undirected graph without cycles is called a tree. Trees is a class of graphs which is interesting not only for people, but for ants too.

An ant stands at the root of some tree. He sees that there are $ n $ vertexes in the tree, and they are connected by $ n-1 $ edges so that there is a path between any pair of vertexes. A leaf is a distinct from root vertex, which is connected with exactly one other vertex.

The ant wants to visit every vertex in the tree and return to the root, passing every edge twice. In addition, he wants to visit the leaves in a specific order. You are to find some possible route of the ant.

输入格式

The first line contains integer $ n $ ( $ 3<=n<=300 $ ) — amount of vertexes in the tree. Next $ n-1 $ lines describe edges. Each edge is described with two integers — indexes of vertexes which it connects. Each edge can be passed in any direction. Vertexes are numbered starting from $ 1 $ . The root of the tree has number $ 1 $ . The last line contains $ k $ integers, where $ k $ is amount of leaves in the tree. These numbers describe the order in which the leaves should be visited. It is guaranteed that each leaf appears in this order exactly once.

输出格式

If the required route doesn't exist, output -1. Otherwise, output $ 2n-1 $ numbers, describing the route. Every time the ant comes to a vertex, output it's index.

样例 #1

样例输入 #1

    3
    1 2
    2 3
    3

样例输出 #1

    1 2 3 2 1

样例 #2

样例输入 #2

    6
    1 2
    1 3
    2 4
    4 5
    4 6
    5 6 3

样例输出 #2

    1 2 4 5 4 6 4 2 1 3 1

样例 #3

样例输入 #3

    6
    1 2
    1 3
    2 4
    4 5
    4 6
    5 3 6

样例输出 #3

    -1

思路

看到大佬写树上差分,LCA,暴力……(CF29D题解),代码都太长太冗杂辣,(我们老师说过:煞笔题目用煞笔方法做,牛笔题目用牛笔方法做,用牛笔方法做煞笔题目只能证明你是个煞笔),我这个蒟蒻这里给出一个不同的思路。

根据直觉,不难想到用\(Floyd\)来求任意两点间的最短路径,然后迭代找出路径,每次都往距目标点距离更近的点走。

\(Floyd\)的实现在这里就不赘述,需要了解的小伙伴可以看我的代码,也可以去最短路 - OI Wiki

我的代码简单易懂,\(calc\)函数用于找出\(x,y\)两点的最短路径,\(main\)里主要写了初始化以及生成\(dist\)数组,为了实现\(Floyd\)。

代码实现

// Problem: Ant on the Tree
// URL: https://www.luogu.com.cn/problem/CF29D
// Memory Limit: 250 MB
// Time Limit: 2000 ms
// Author: j1hx
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
int d[305][305],n;
vector<int> a,ans;
void calc(int x,int y)
{
	int i;
	while(x!=y)
	{
		for(i=1;i<=n;i++)
		{
			if(d[x][i]==1&&d[i][y]<d[x][y])
			{
				x=i;
				ans.push_back(x);
				break;
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			d[i][j]=(i==j)?0:1e9;
		}
	}
	for(int i=0;i<n-1;i++)
	{
		int x,y;
		cin>>x>>y;
		d[x][y]=d[y][x]=1;
	}
	int x;
	a.push_back(1);
	while(cin>>x)
	{
		a.push_back(x);
	}
	a.push_back(1);
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
			}
		}
	}
	for(int i=0;i<a.size()-1;i++)
	{
		calc(a[i],a[i+1]);
	}
	if(ans.size()!=2*(n-1)) cout<<-1<<endl;
	else
	{
		cout<<1<<" ";
		for(int i=0;i<ans.size();i++)
		{
			cout<<ans[i]<<" ";
		}
	}
	return 0;
}

标签:输出,int,Tree,煞笔,样例,CF29D,Ant,节点
From: https://www.cnblogs.com/j1hx-oi/p/18344911

相关文章

  • Java集合:Collection and Map;ArrayList;LinkList;HashSet;TreeSet;HashMap;TreeMap;Iterator:
        集合介绍:                        是一组变量类型(容器),跟数组很像。一,引用集合的原因(必要性):                  A:数组的空间长度固定,一旦确定不可以更改。多了浪费,少了报错。          B:使用数......
  • SemanticKernel/C#:实现接口,接入本地嵌入模型
    前言本文通过Codeblaze.SemanticKernel这个项目,学习如何实现ITextEmbeddingGenerationService接口,接入本地嵌入模型。项目地址:https://github.com/BLaZeKiLL/Codeblaze.SemanticKernel实践SemanticKernel初看以为只支持OpenAI的各种模型,但其实也提供了强大的抽象能力,可以通过......
  • 为什么 xgboost.QuantileDMatrix 使用自定义数据迭代器对数据进行四次传递?
    我正在尝试使用自定义数据迭代器,如下所示此处,因为我的数据集太大。只是为了测试它是如何工作的,我正在使用示例的子集并运行以下代码。X是我的数据的numpy数组。我的迭代器如下所示classIterForQDMatrix(xgb.core.DataIter):def__init__(self,d......
  • ReentrantLock的阻塞性、可中断性
    结论:lock()如果没有获取到锁,会一直阻塞并尝试获取锁,直到获取到锁。lock()获取到锁之前,其他线程不可以中断该线程。因为线程Thread如线程t2的interrupt方法,想要中断线程,但不会真的中断,只会把t2的中断标志改变,所以线程t2还会继续运行。lockInterruptibly()获取到锁之前,其他线......
  • APP逆向 day26unidbg下-pdd(anti)案例
    一.前言今天我们讲unidbg的下篇,也就是unidbg基础的最后一个部分,我们上节课也有补环境,比如补java环境,补安卓环境,这节课我们讲的肯定比这些都要难,我会给出一个之前讲过的案例,然后会讲一个全新的案例,pdd,这个里面的环境就更加难了,让我们接着往下看吧二.B站sign参数2.1回顾sign......
  • 《Advanced RAG》-05-探索语义分块(Semantic Chunking)
    摘要文章首先介绍了语义分块在RAG中的位置和作用,并介绍了常见的基于规则的分块方法。然后,阐述了语义分块的目的是确保每个分块包含尽可能多的独立语义信息。接着,文章分别介绍了三种语义分块方法的原理和实现方法,并对每种方法进行了总结和评估。文章观点语义分块是R......
  • U盘版:RadiAnt DICOM 查看器 CD/DVD 2023.1 Crack
    RadiAntDICOM查看器CD/DVD2023.1建于2023年3月29日CD/DVD自动运行包新功能:长度比计算。椭圆体/子弹体积计算。改进和错误修复:增加了对某些不完全符合标准的DICOM文件的支持。增加了对一些不常见的JPEG2000编码DICOM图像的支持。RadiAntDICOMView......
  • 论文解读:LSM Tree 的魔力,提升写入吞吐量的高效数据存储结构
    LSMTree是一种用于高写入吞吐量的数据库存储引擎,广泛应用于现代分布式数据库系统。其核心思想是将写入操作缓存在内存中,并定期批量写入磁盘,减少磁盘I/O操作,提高写入性能。因其高效的写入性能和适应大规模数据的能力,成为现代数据密集型应用的关键技术之一。LSM-tree主要由三......
  • 使用django-treebeard实现树类型存储与编辑
    前言其实之前做很多项目都有遇到跟树相关的功能,以前都是自己实现的,然后前端很多UI组件库都有Tree组件,套上去就可以用。不过既然用Django了,还是得充分发挥一下生态的优势,但是我找了半天,也就这个treebeard能用,其他要不停更了要不就功能很拉,没有可视化编辑树的功能。难道Djang......
  • 康托(Cantor)展开与逆展开理解与运用
    前言    文章仅作参考、学习    作者本人的文章是分享自己对于一些算法、数据结构、技巧的理解,写的内容可能比较简单或偏于大众化,也更好理解。文章后面通常会配套题目与题解:)。    本文章内容依据“CCBY-NC-SA4.0”许可证进行授权。转载请署名、......