【NOIP2018】【洛谷P5022】旅行【基环树】

【算法竞赛学习笔记】基环树-超有用的图论详解 title : 基环树 date : 2021-8-29 tags : ACM,图论 author : Linno 简介 基环树是一个n个点n条边的图,比树多出现一个环,因此称为基环树。 找环 对于无向图 通过拓扑排序可以找出环上的所有点。 void topsort(){ int l=0,r=0; for (int i=1;i<=n;i++) if(in[i]==1) q[++r]=i; while(l<r) { int now=q[++. 阅读详情

题目大意:

题目链接:https://www.luogu.org/problemnew/show/P5022
给出一棵 n n n个点 n n n或 n − 1 n-1 n−1条边的图,从任意点开始遍历的方法的字典序。


思路:

很明显,开始肯定是要在点 1 1 1,这样才能保证字典序最小。
建图时要先排序,保证邻接表访问的顺序到达点是升序。也是为了保证字典序最小。
然后分类讨论。


1.树( n n n点 n − 1 n-1 n−1边)

从点 1 1 1开始暴力跑,因为每次会跑到编号最小的节点,所以跑一边的答案就是最终答案。


2.基环树( n n n点 n n n边)

找到环,断环,然后按树跑就可以了。


但是这道题还是很恶心,打了我 2 h 2h 2h。
一开始用邻接矩阵还 T T T了。。。
在这里插入图片描述


代码:

//代码丑见谅
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int N=5010;
int n,m,s,ans[N],a[N],tot,head[N];
bool vis[N],v[N],ok;

struct edge
{
	int next,to;
}e[N*2];

struct node
{
	int x,y;
}map[N*2];  //排序用

void add(int from,int to)
{
	e[++tot].to=to;
	e[tot].next=head[from];
	head[from]=tot;
}

void ask(int x,int fa,int xx,int yy)
{
	if (x==1) s=0;
	a[++s]=x;
	vis[x]=1;
	for (int i=head[x];~i;i=e[i].next)
	{
		int y=e[i].to;
		if (!vis[y])
			if ((x!=xx||y!=yy)&&(x!=yy||y!=xx))  //断环
				ask(y,x,xx,yy);
	}
	vis[x]=0;
}

void check() //求最优答案
{
	for (int i=1;i<=n;i++)
		if (a[i]<ans[i]) break;
		else if (a[i]>ans[i]) return;
	memcpy(ans,a,sizeof(a));
}

void dfs(int x,int fa)
{
	if (v[x])  //找到环
	{
		ok=1;
		return;
	}
	v[x]=1;
	for (int i=head[x];~i;i=e[i].next)
		if (e[i].to!=fa) 
		{
			int y=e[i].to;
			dfs(y,x);
			if (ok)  //已经有环了
			{
				ask(1,0,x,y);
				check();
				return;
			}
		}
	v[x]=0;
}

bool cmp(node x,node y)
{
	if (x.x<y.x) return 1;
	if (x.x>y.x) return 0;
	if (x.y<y.y) return 0;
	return 1;
}

int main()
{
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++)
	{
		scanf("%d%d",&map[i].x,&map[i].y);
		map[i+m].x=map[i].y;
		map[i+m].y=map[i].x;
	}
	sort(map+1,map+1+m*2,cmp);
	for (int i=1;i<=2*m;i++)
		add(map[i].x,map[i].y);
	if (n>m)
	{
		ask(1,0,-1,-1);
		for (int i=1;i<=n;i++)
			printf("%d ",a[i]);
	}
	else
	{
		memset(ans,0x3f3f3f3f,sizeof(ans));
		dfs(1,0);
		for (int i=1;i<=n;i++)
			printf("%d ",ans[i]);
	}
	return 0;
}
题解:洛谷 P5022 [NOIP 2018 提高组] 旅行 小 Y 的旅行方案是这样的:任意选定一个城市作为起点,然后从起点开始,每次可以选择一条与当前城市相连的道路,走向一个没有去过的城市,或者沿着第一次访问该城市时经过的道路后退到上一个城市。不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路。并且,从任意一个城市出发,通过这些道路都可以到达任意一个其他城市。为了让自己的旅行更有意义,小 Y 决定在每到达一个新的城市(包括起点)时,将它的编号记录下来。个整数,表示字典序最小的序列。的城市之 间有一条道路,两个整数之间用一个空格分隔。 阅读详情

相关推荐

海康工业相机LabVIEW二次开发实战——参数配置优化与图像高效存储

本文详细介绍了海康工业相机在LabVIEW平台上的二次开发实战,重点解析了相机参数配置的优化方法与图像高效存储策略。通过剖析曝光、增益、触发模式等核心参数的设置逻辑,并结合生产者-消费者设计模式,指导开发者构建稳定、高效的图像采集与异步存储流程,有效提升工业视觉项目的开发效率与系统稳定性。

weixin_29306317的博客 219

基环树(环套树) 总结

基环树(环套树) 总结

glorious_dream的博客 3805

最小二乘法(看完即会)

其中,X是数据矩阵,每一行是一个数据点,每一列是一个自变量(包括截距项),Y是观测值向量,β是待求的系数向量。为了找到使S最小的a和b的值,我们需要对S求关于a和b的偏导数,并令它们等于零。最小二乘法的数学公式通常用于线性回归问题,其中目标是找到一条直线(或更高维度的超平面),使得这条直线与给定数据点的误差平方和最小。同样地,通过求偏导数和令偏导数等于零,我们可以得到一个线性方程组,解这个方程组可以找到最优的b_0, b_1, …+ b_m*x_m,其中b_0是截距,b_1到b_m是各个自变量的系数。

qlkaicx的博客 2万+

基环树学习笔记

只因环树学习笔只因。如有错误欢迎指出。

Minecraftwzy的博客 1520

Xiaojie雷达之路---使用CCS创建一个毫米波雷达的工程(AWR1843)

前些天,在工具箱中下载了一个基于毫米波雷达(AWR1843)自动停车的案例,并成果导入CCS中,可以完美运行,但是如何新建一个新的工程呢?这篇文章就会对其进行讲述。

XiaoJie的博客 4548

AI重塑运营商CRM:从传统办理到智能推荐的实战经验

本文探讨了AI技术如何重塑运营商CRM系统,从传统办理模式升级为智能推荐平台。文章首先分析了传统CRM系统在产品推荐效率、客户信息录入、业务流程和个性化服务等方面的痛点,提出AI赋能的解决方案。技术架构采用分层设计,包含智能推荐引擎、知识图谱系统和大模型集成三大核心模块。实战案例详细介绍了基于深度学习的智能推荐系统实现,包括用户行为特征提取、产品特征建模、推荐模型训练和实时推荐服务等关键组件代码实现,展示了AI如何提升运营商CRM系统的智能化水平和服务效率。

技术传感器的博客 1048

基环树总结

基环树总结

ZhuRanCheng的博客 2822

ADS2023仿真变容二极管特性

仿真S-Param仿真控件,设置为Single Point,将频率设置为1MHz,同时勾选Z-parameters,取消S-parameters,从元件库中选择元器件搭建原理图,并根据器件spice提供的相关参数,对原理图中器件参数进行修改,修改完成的电路图如下图所示。添加var控件和MeasEqn控件,相关设置如图所示,Ct为变容管的电容值,Q0为其品质因数。因此,对变容二极管的模型仿真结果是可以信赖的。将其解压,在spice文件夹中,可以找到我们想要的器件参数,和仿真简要电路图。

weixin_45811090的博客 1万+

学习笔记 ---- 基环树

破环成链并复制一倍接在后面,考虑固定一个起点的环可以由一个长度和环相等的区间表示。对于环上的点,可以求出以它为根的子树的最大点独立集。这里的子树不包括环上的点。那么把环找出来,枚举不被经过的边打上标记,然后按照树的方式得到一个答案,将所有答案取最优即可。为起点,每次往编号最小的儿子的子树里递归。这个是简单的:如果不位于同一棵基环树,那么显然不可能。个点不选/选,第一个点不选/选 的最大点独立集。最后如果每个位置上的数能变成一个合法的数,那么返回。号点不选/选 的最大点独立集。单调不降,输出最小的操作次数。

weixin_55851276的博客 2242

打造你自己的小程序容器 —— 一套能装得下整个未来的跨端技术!

摘要: 本文介绍了一种基于Capacitor框架开发的轻量级“小程序容器”解决方案——LapDrop。通过模拟微信小程序的运行逻辑(动态加载、原生能力调用、沙盒环境),LapDrop允许开发者自主构建跨平台(iOS/Android/Web)的小程序生态。其核心利用Capacitor的插件桥接机制,实现JS与原生功能的无缝调用,并支持浏览器调试与原生环境一致化。优势包括插件化架构、状态隔离、热更新及开放权限控制,适用于企业级模块化应用或开发者工具。未来计划扩展生命周期管理、远程加载等功能,目标成为开源的小程序

CangYuChenAi的博客 973

sec_uid

webcast_uid转sec_uid,webcast_uid转uid,webcast_uid转dy号

m0_56967679的博客 4418

图论——基环树

基环树,就是n个点n条边的树,因为这个图相当于在树上加了一条边,故一定会形成一个环 所以基环树上的问题大多数都是先处理以环上的点为根节点的子树的值,然后在环上做dp之类的东西 找到环是基环树上的问题的重要一步,可以记录下来每个点的时间戳,若一个点的子节点被访问过了,那么这两个点一定是环上的节点,以这两个点为首尾讲一个环找到 为了方便,当且仅当一个点的子节点被遍历过且这个点的时间戳小于它的子节点的时间戳,我们才开始记录这个环 void get_cir(int x){ dfn[x]=++times;

hungry1234的博客 1185

第一章 EB安装

1.DemoWorkspace 是基于EB当前组件配置下的例程,包含了启动文件和中断服务函数以及组件demo。2.Mclsar 下存放的是EB的插件包和静态MCAL的驱动文件。

舊梦的博客 1953

【基环树,Topsort】洛谷P5022 旅行

基环树瞎搞

Ajwallet 535

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

洛谷P5022 [NOIP2018 提高组] 旅行 题解

int u,v;n,m为输入数据,结构体edge用来存边,vector用来边排序,ans数组存最终答案。

SJ091105的博客 2003

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

P5022 [NOIP2018 提高组] 旅行(基环树应用)

无向图的双连通分量问题、基环树应用、dfs递归处理

酒姬民的博客 652

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【NOIP2018】旅行 (洛谷P5049 / P5022) O(nlogn)题解

传送门。 此题可以先从数据范围入手,观察m的范围(m == n || m == n - 1)可知此题发生在一棵树或一棵基环树上。 什么是基环树? 基环树又称 环套树 、 树套环 、 章鱼图。顾名思义,即由环和树组成的图,但特殊的是它只含有一个环,即一棵树再加一条边构造而成。对于这种图的处理,通常是找到合适的位置将环断开,使其转化为树进行处理。 将环断开后,我们有了一棵树。 那么如何在树上贪心? 60%做法 对于(...

Duawieh的博客 907

洛谷P5022 [NOIP2018 提高组] 旅行题解

题目背景 NOIP2018 提高组 D2T1 题目描述 小 Y 是一个爱好旅行的 OIer。她来到 X 国,打算将各个城市都玩一遍。 小 Y 了解到,X 国的n个城市之间有m条双向道路。每条双向道路连接两个城市。 不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路。并且, 从任意一个城市出发,通过这些道路都可以到达任意一个其他城市。小 Y 只能通过这些 道路从一个城市前往另一个城市。 小 Y 的旅行方案是这样的:任意选定一个城市作为起点,然后从起点开始,每次可 以选择一条与

inhuibin的博客 890

【luogu P5022 旅行】 题解

题目连接:https://www.luogu.org/problemnew/show/P5022 \(NOIP2018 DAY2T1\) 考场上只写了60分,很容易想到当 m = n - 1 时的树的做法。 读题推一下样例不难发现,如果选择一个分支节点就必须走到头——直到一个节点没有子树。 那么我们就可以贪心的求得最小字典序序列,每次选择节点编号最小的走。 即对当前节点的所有子节点排序选...

179

洛谷 P5022 [NOIP2018 提高组] 旅行

dfs

2403_87021226的博客 939

【NOIP2018】旅行

题面 https://www.luogu.org/problem/P5022 题解 #include<iostream> #include<vector> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ...

weixin_30362233的博客 126

竞赛题解 - NOIP2018 旅行

\(\mathcal {NOIP2018} 旅行 - 竞赛题解\) 坑还得一层一层的填 填到Day2T1了 洛谷 P5022 题目 (以下copy自洛谷,有删减/修改 (●ˇ∀ˇ●)) 题目描述 小 Y 是一个爱好旅行的 OIer。她来到 X 国,打算将各个城市都玩一遍。 小Y了解到, X国的 \(n\) 个城市之间有 \(m\) 条双向道路。每条双向道路连接两个城市。 不存在两条连接同一对...

weixin_34414196的博客 227

2018 NOIP 提高组 复赛 day2

文章目录T1 旅行T1分析 不得不说…noip的趋势越来越像是day1基础+思路稳定分数,基本确定你能在哪个获奖区,day2难度提高,给满分dalao拼技术和给day1二等的人一个拿一等的机会,给三等的摸一个二等的机会… 总感觉这个day2数据放大就是一套省选… T1 旅行 题目点击→洛谷 P5022 旅行 题目描述 小 Y 是一个爱好旅行的 OIer。她来到 X 国,打算将各个城市都玩一遍。 小...

jnxxhzz的博客 1万+

luogu5022 [NOIp2018]旅行 (dfs)

m=n-1的时候,就直接贪心地dfs就可以 m=n的话,就可以枚举删掉一条边,然后照着m=n-1做 $O(n^2)$大概能过 (然而我眼瞎看不到m<=n) 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector&g...

weixin_30237719的博客 94

2026年CSP-S复赛赛前冲刺必刷题单

学而思编程官网已经为大家整理好了 CSP-S 必刷题单 ,方便同学们全力备战2026年CSP-S考试,一起加油备考!

团爸讲算法 233
上一篇: 【POJ3417】Network【LCA】【差分】
下一篇: 【洛谷P1198】最大数【分块】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值