首页 > 其他分享 >基环树学习笔记

基环树学习笔记

时间:2023-01-25 16:55:07浏览次数:68  
标签:return 外向 int 笔记 学习 基环树 fid ans

基环树

以下内容参考:https://www.cnblogs.com/fusiwei/p/13815549.html

概念

基环树也叫环套树,标准定义是一个有 \(n\) 个节点 \(n\) 条边的联通图,如果不是联通的,则称其是一个基环树森林。

例如下面这张图就是一个基环树。

image

如果我们把里面的环内的任意一条边给断开,他就会变成一棵树,如果把这个环全部断掉则会变成一个森林。

内向树和外向树

所谓内向树的定义是每个点有且只有一条出边。也就是这棵树给人的大体感觉是向内的。

所谓外向树的定义是每个点有且只有一条入边。也就是这棵树给人的大题感觉是外向的。

例如下面这个就是一棵内向树。

image

而下面这个就是一棵外向树。

image

基环树题型

根据上面的定义介绍,我们可以感觉到,基环树虽然被单独拿出来讨论,但是其本质上还是一个比较简单且好理解的数据结构之一。所以它只能适当地提升题目难度,并不能说一个树的题变成基环树就大大增强了。

一些经典例题有:基环树直径、基环树两点之间距离,基环树DP,等。

这些模型的解决通法一般是:断环成树,然后将若干棵树处理好之后,再考虑环对答案的影响。也就是将环、树分开讨论解决问题。这时,用”环套树“这个名词来形容基环树,很是容易理解。

P8655 [蓝桥杯 2017 国 B] 发现环

题目的意思简洁明了,就是让你找一个环,并且要按编号从小到大输出环内的所有点。

我们可以用并查集来判断是否有环,我们边加边边合并,如果当前两个点已经在同一集合内的话,说明已经有环了,且环的所有边都已经加进去了。然后我们再跑一遍 dfs 后直接 sort 一下输出即可。

#include<bits/stdc++.h>
#define int long long
#define N 1001000
using namespace std;
int n,f[N],vis[N];
vector<int>v[N],ans;
inline int fid(int x)
{
	if(f[x]==x)return x;
	return f[x]=fid(f[x]); 
}
inline void merge(int x,int y)
{
	int xx=fid(x);
	int yy=fid(y);
	if(xx!=yy)
	  f[xx]=yy;
}
inline void dfs(int s,int t)
{
	if(s==t)
	{
		sort(ans.begin(),ans.end());
		for(int i=0;i<ans.size();i++)
			cout<<ans[i]<<' ';
		exit(0);
	}
	for(int i=0;i<v[s].size();i++)
	{
		int u=v[s][i];
		if(!vis[u])
		{
			vis[u]=1;
			ans.push_back(u);
			dfs(u,t);
			ans.pop_back();
			vis[u]=0;
		}
	}
}
signed main()
{
	int a,b;
	cin>>n;
	for(int i=1;i<=n;i++)
	  f[i]=i;
	for(int i=1;i<=n;i++)
	{
		cin>>a>>b;
		v[a].push_back(b);
		v[b].push_back(a);
		if(fid(a)!=fid(b))
		  merge(a,b);
		else break;
	}
	vis[a]=1;
	ans.push_back(a);
	dfs(a,b);
	return 0;
}

标签:return,外向,int,笔记,学习,基环树,fid,ans
From: https://www.cnblogs.com/Multitree/p/17067060.html

相关文章

  • excel的学习9-函数<1>
    函数插入函数excel插入函数有三种方式:手写在要使用函数的单元格内写入函数,首先,写一个等号,再写相应的表达式,然后,回车即可。fx就是表格上方的一个很小的区域(如下图所......
  • 机器学习挑战与云原生平台优势
    机器学习已成为企业争相追逐的发展方向,但实施过程中的挑战不容忽视。1.数据获取机器学习应用的核心挑战是收集和组织模型训练所需的数据,这与学术界科学研究的场景形成鲜......
  • c++学习日记day1 1/25
    B.超重青蛙题目描述在青蛙王国,每个青蛙有着不同的体重。给出一组青蛙的体重,计算里面超出平均体重的青蛙数量。 输入第一行输入参数T,表示有T个测试实例第二行输入......
  • linux学习路线
    对于linux的学习,可以先自己搭建一个ubuntu服务器,同时搭建通过内网穿透等熟悉对ubuntu的各种操作。具体的linux命令学习,我这里是通过学习阿里云开发者社区的教程和视频htt......
  • 学习笔记——NoSQL数据库;Redis概述;redis中常用的数据类型(key、string)
    2023-01-24一、NoSQL数据库1、NoSQL数据库的简介NoSQL(NoSQL=NotOnlySQL),即“不仅仅是SQL”,泛指非关系型的数据库。NosQL不依赖业务逻辑方式存储,而以简单的key-value模......
  • JavaScript学习笔记—函数的bind
    bind():函数的方法,可以用来创建一个新的函数bind可以为新函数绑定thisbind可以为新函数绑定参数functionfn(a,b,c){console.log("fn执行了~~~",this);consol......
  • JavaScript学习笔记—函数中的call和apply
    调用函数除了通过函数()这种形式外,还可以通过其他的方式来调用函数,比如可以通过调用函数的call()和apply()两个方法来调用函数函数.call()函数.apply()call和apply除......
  • JavaScript学习笔记—可变参数
    可变参数可以接收任意数量实参,并将他们统一存储到一个数组中返回可变参数的名字可以自己指定可变参数就是一个数组,可以直接使用数组的方法可变参数可以配合其他参数一......
  • 如何从入门开始学习OpenCV?
    一、OpenCV简介OpenCV是一款由Intel公司俄罗斯团队发起并参与和维护的一个计算机视觉处理开源软件库,支持与计算机视觉和机器学习相关的众多算法,并且正在日益扩展。1.1OpenC......
  • 笛卡尔树学习笔记
    笛卡尔树下文的资料多摘自OIWiki性质笛卡尔树是一种二叉树,每一个节点都由一个键值二元组\((k,w)\)构成。要求\(k\)满足二叉搜索树的性质,而\(w\)满足堆的性质。如......