栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

啊哈算法——第七章:树

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

啊哈算法——第七章:树

第七章:树

树可以视作特殊的图,数据结构中的树具有下列性质:

  • 一棵树中的任意两个结点有且仅有唯一的一条路径相通。
  • 一棵具有n个结点的树,一定有n-1条边。
  • 在一棵树中加入任意一条边将会构成回路。

或者说,树是指任意两个结点间有且仅有一条路径的无向图。只要是没有回路的连通无向图就是树。

二叉树

是一种特殊的树。每个结点最多有两个子结点。

  • 满二叉树:严格定义为深度为h且有2h-1个结点。
  • 完全二叉树:完全二叉树中,如果一棵树有右子节点,那么它一定有左子节点。

完全二叉树最典型的应用就是堆。

  • 堆最大的应用就是优先队列,在C++STL中可以使用queue库中的priority_queue来建立优先队列对象。
  • 大(小)根堆:结点的键值都大(小)于其父节点的键值,否则将父结点和子结点进行交换(优先交换较大(小)项)。
并查集

模板:
n个人,m对关系,p个查询操作。

#include 
#include 
using namespace std;
const int maxn = 5005;
int f[maxn] = {0};
int findf(int x){
	if(x == f[x])	return x;
	return f[x] = findf(f[x]);	//压缩路径 
}
int n,m,p;
int main()
{
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++){
		f[i] = i;
	}
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		int fu = findf(u),fv = findf(v);
		if(fu != fv){
			f[fu] = fv;
		}
	}
	for(int i=1;i<=p;i++){
		int u,v;
		cin>>u>>v;
		if(findf(u) == findf(v)){
			cout<<"Yes"< 

压缩路径模板:

int findf(int x){
	if(x == f[x])	return x;
	return f[x] = findf(f[x]);	//压缩路径 
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/312304.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号