NEFU离散数学实验特别篇1-树和图

树相关概念

离散数学中,树是一种重要的数据结构,它是一种无向连通图,并且不存在环。下面是树的相关概念和公式:

1. 顶点数为n的树,边数为n-1。

2. 度数为k的树中有k个分支。

3. 一棵树中最多只有两个度数大于1的顶点,这些顶点称为树的端点或叶子,其余顶点称为分支或内部点。

4. 一棵有n个顶点的满二叉树,深度为h,共有2^(h+1)-1个结点,其中叶子结点数为2^h。

5. 一棵有n个顶点的完全二叉树,深度为h,共有2^h个结点,其中叶子结点数为2^(h-1)或2^h。

6. 一棵二叉树的深度为h,最多有2^h-1个结点,最少有h个结点。

7. 一棵n个结点的树,最多h=n-1,最小为1,树的高度即为树的深度。

8. 一个树森林(由若干棵树组成)中,所有树的节点数n等于边数m+森林中树的棵树。

9. 一棵树的生成森林中,边数为n-1。

10. 一颗有n个顶点的有根树,每个顶点都有度数,度数为0的顶点称为叶子顶点,度数不为0的顶点称为内部顶点,如果叶子顶点的数量为m,那么内部顶点的数量为n-m。

1. (程序题)2元完全正则树

思路
P178概念题目啦
知道啥是2元完全正则树即可
概念拆分:
r元树:T的每个分支点至多有r个儿子
r元正则树:T的每个分支点恰好有r个儿子
r元完全正则树:T是r元正则树,且所有树叶的层数均为树高
树的层数:树根到任意一点的通路长度
树的高:最大层数

可以发现,对于树高为h的2元完全正则树

顶点数=2^{h+1}-1

边数=0+2+4+8+16....
树叶=2^h

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main(){
	int h;
	scanf("%d",&h);
	int edge=0;
	for(int i=1;i<=h;i++)edge+=1<<(i);
	printf("%d %d %d",(1<<(h+1))-1,edge,1<<h);
	return 0;
}

2. (程序题)树的边数

思路
2元正则树:T的每个分支点恰有2个儿子
其实想想最特殊的情况,2元完全正则树嘛(可以先看后面的一道题目)
可以发现m = 2 ( t − 1 ) m=2(t-1)m=2(t−1)

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(){
	int t;
	while(~scanf("%d",&t)){
		printf("%d\n",2*(t-1));
	}
	return 0;
}

 图相关概念

离散数学是一门研究离散化的数学学科,图论是其中的一个分支,涉及到一些基本概念和公式,包括:

1. 图的基本概念:
- 顶点(vertex):图中的节点。
- 边(edge):连接顶点的线段。
- 无向图(undirected graph):图中的边没有方向。
- 有向图(directed graph):图中的边有方向。
- 加权图(weighted graph):图中的边带有权值。

2. 图的表示方法:
- 邻接矩阵:用一个矩阵来表示图中顶点之间的关系。
- 邻接表:用链表来存储图中顶点之间的关系。
- 关联矩阵:用一个矩阵来表示图中边与顶点之间的关系。

1. (程序题)度数序列

思路
可以看一下书本P135的例6.3
根据握手定理:所有顶点度数之和为边数两倍。
那么有推论,奇度顶点的个数一定是偶数的。 

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(){
	int n;
	while(~scanf("%d",&n)){
		int cnt=0;
		for(int i=1,x;i<=n;i++){
			scanf("%d",&x);
			if(x&1)cnt++;// 如果x是奇数,计数器cnt加1 
		}
		if(cnt&1)puts("no"); // 如果计数器cnt是奇数,输出"no"
		else puts("yes");
	}
	return 0;
}

2. (程序题)平面图 

思路
书本P159定理6.16
设G为任意的连通的平面图,则n-m+r=2。其中n为顶点数,m为边数,r为面数满足

n-m+r=2 

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(){
	int n,r;
	while(~scanf("%d%d",&n,&r)){
		printf("%d\n",n+r-2);
	}
	return 0;
}

 3. (程序题)计算连通分支数

思路
书P159推论
G是具有k(k>=2)个连通分支的平面图,则n-m +r=k +1

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(){
	int n,m,r;
	scanf("%d%d%d",&n,&m,&r);
	printf("%d",n-m+r-1);
	return 0;
}

 4. (程序题) 求悬挂顶点

思路
根据握手定理:所有顶点度数之和为边数两倍
悬挂顶点度数为1。
设有x个悬挂顶点

2m=(2+3+4+5+6)t+x
x=2m-20t 

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(){
	int m,t;
	scanf("%d%d",&m,&t);
	printf("%d",2*m-20*t);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟雨平生9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值