没有合适的资源?快使用搜索试试~ 我知道了~
NUAA离散数学课设报告,包含源代码 (一专业96分)
需积分: 0 0 下载量 186 浏览量
2024-04-01
11:34:08
上传
评论
收藏 768KB DOCX 举报
温馨提示
试读
29页
这里是NUAA离散数学课设报告,包含源代码。 本次课设题目:实现求欧拉回路算法。 经过答辩获得96分。
资源推荐
资源详情
资源评论
目录
实现求欧拉回路算法 ........................................................................................................................................2
162110304 李欣彤....................................................................................................................................2
一些前情提要: ........................................................................................................................................2
输入......................................................................................................................................................2
算法 ........................................................................................................................................................................2
无向图 ..........................................................................................................................................................3
时间复杂度与空间复杂度.............................................................................................................4
框图(无向图) ...............................................................................................................................5
测试用例.............................................................................................................................................8
有向图........................................................................................................................................................12
时间复杂度与空间复杂度 ..........................................................................................................13
框图(有向图).............................................................................................................................14
测试用例 ..........................................................................................................................................17
心得体会.............................................................................................................................................................22
全部源代码........................................................................................................................................................22
无向图........................................................................................................................................................22
有向图........................................................................................................................................................26
已答辩
实现求欧拉回路算法
162110304 李欣彤
一些前情提要:
1. 无向图和有向图都用邻接矩阵存储,该邻接矩阵不是正好的,多出来一行一
列(第一行和第一列),这样提高了可读性。
2. 创建一维 vector 容器 degree,用于存放每个顶点的度数(无向图用到,有向
图没用),初始化为 0。
3. 创建二维 vector 容器 vec,用于存放图的邻接矩阵,初始化为 0。
4. 创建一维 stack 容器 s,用于存放欧拉回路并输出。
5. 创建一维 queue 容器 q,用于存入广度优先遍历经过的点。
6. 创建一维 vector 容器 b,为 bool 类型,用于判断是否为连通的,初始化为
false。
7. 变量 n 是无向图的总顶点数,m 是总边数。
输入
1. 首先输入 n 和 m,然后根据图输入每条边关联的两个顶点,注意:无向图不
用注意输入顶点的次序,有向图需根据边的方向依次输入与其关联的顶点。
2. 一边输入一边形成邻接矩阵。
算法
上面讲的都是有向图和无向图共同拥有的,下面讲不同的
无向图
1. 输入完成之后,先判断该图是不是平凡图,是平凡图输出“平凡图也是欧拉
图”,结束程序运行;若不是,程序继续运行。
2. 已知:任意一个无向图为欧拉图的条件:当且仅当该无向图的所有顶点的度
数均为偶数,且该图连通。
3. 先判断这个图是不是连通的,这里用到广度优先遍历(BFS):
(1) 首先我们在前面定义了类型为 bool 的一维 vector 容器 b,初始化为
false,以便后续判断。同时我们创建一维队列 q,用于存放顶点。接
下来我们把 start 插入队列中,并让 B[start]=true。(B 是 b 的引用)
(2) 接下来我们用 while 循环语句来进行连通图的判断,循环条件为队列 q
不为空,此时令 start=q.front(),然后删除 q 最前面的元素,这一步骤
是为了删除已经走过的顶点。
(3) 接下来用 for 循环遍历,如果此时对应的顶点 start 存在邻接的顶点
(vec[start][i]!=0),并且 B[i]==false(没走过这个顶点),那我们将顶
点 i 插入队列中,并让 B[i]=true,代表已经走过该顶点。
(4) 重复(2),(3)步骤直至队列为空。
(5) 此时我们回到 main 函数中,用 for 循环语句进行判断,如果存在任意
顶点 b[i]==false,证明该图不是连通的,结束程序运行。
4. 紧接着我们判断每个顶点的度数,遍历所有顶点:
(1) 若所有顶点度数对 2 取余为 0,说明该图满足存在欧拉回路的条件。
(2) 若有两个顶点对 2 取余不为 0,说明该图中存在欧拉通路但不存在欧
拉回路,结束程序运行。
(3) 除上述两种情况外,其余情况均不存在欧拉回路,结束程序运行。
5. 若满足存在欧拉回路的条件,我们接下来向栈中插入顶点。(用到递归)
(1) 最开始时,传入的参数 node=1,参数 num=n。
(2) for 循环遍历无向图的邻接矩阵,如果当前对应 vec[node][i] 的值不为
0,那么证明 node 与 i 点之间存在一条边,将 vec[node][i]与 vec[i][node]
的值都减 1 后,我们递归调用该函数,此时参数 node=i,参数
num=n。
(3) 在递归调用下面的语句是将本次的 i 值插入栈中,注意,该语句不能
写在 for 循环外面,必须写在 for 循环里面,不然每次插入栈中的值都
是 5。
(4) 重复步骤(2),直至结束,此时我们也找出了欧拉回路。
6. 打印欧拉回路。程序运行结束。
时间复杂度与空间复杂度
时间复杂度:时间复杂度最高的是插入节点 push _ node()这个函数, push _ node()利用回溯
的方法查找欧拉回路。因为要查找整个邻接矩阵,所以此时算法的 O(n)=|n^2|。
空间复杂度:
因为要存入有向图的邻接矩阵,所以空间复杂度是 O(n^2)
框图(无向图)
输入无向图的点数 n 和 边数 m
若 n==1,m==0,则输入的图是平
凡图,结束程序运行
创建存放各顶点度数的一维数组 degree 和存放该无
向图的邻接矩阵的二维数组 vec
利用 for 循环,循环条件小于边数 m:输入任意两个顶点 u、v(这两个顶点
彼此相邻),在输入的同时这个两个顶点对应的度数 degree[u]和 degree[v],
与邻接矩阵的 vec[u][v]、vec[v][u]都分别加一
特殊情况
先判断是否为连通图
利用广度优先遍历来判断该图的连通性。我们创建一维 bool 数组 b ,用于表示顶点是否被访问。
我们先规定:访问过的顶点标为 true,未被访问的顶点标为 false,b 全部初始化为 false。
我们创建一维队列 q,用于存储已经访问过的顶点。
存各点度数和无向图的邻接矩阵
while(q 非空)
Start=队列首元素,然后删除队列首元素
for (int i = 1; i <= n; i++) {
if (还没经过该点(该点为false) &&邻接矩阵中vec[start][i]!=0) {
该点入队,然后该点标记为true
}
}
//先访问顶点 1,然后访问与顶点 1 相邻的其他顶点,找到与 1 邻接但未访问
过的顶点后,将其入队,然后把其标记为 true。重复上述操作直至所有顶点
都被访问过。
剩余28页未读,继续阅读
资源评论
Lllllllxt
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功