DS博客作业06--图
1.本周学习总结
1.1思维导图
1.2学习体会
这两周学习的内容主要是图结构,图结构有很多的操作以及算法,其中邻接表和邻接矩阵都是图中的重要存储结构,建图的方式也包含了邻接矩阵见图和邻接表建图两种方式,两种建表的方式有不同的地方,首先是邻接矩阵,邻接矩阵建表比邻接图稍微简便一些,对于无向图的邻接矩阵,只需要两重循环,第一个循环将矩阵中所有元素的值赋0,然后输入邻截表的顶点和弧数,再次进行循环,把相邻的两个顶点用1来表示。邻接表建表用的方法是链表建表,需要在adjlist数组的每个元素后面都插上一串链,插入的方法一般选择头插法。如果遇到带权图的话,邻接矩阵见图方法不变,第二次循环输入的时候就是权值了,并且还要设置一个无穷符号的插入判断:而对于邻接表来说,需要插入的节点改变,每个节点都要做出修改。不光是建图,图的遍历也是一块内容,包括深度和广度遍历,相当于层次遍历和优先遍历。便利之后学习的就是几种算法了,Kruscal算法和prim算法,详细的做法就不介绍了。接下来的是顶点到顶点之间的最短路径的寻找和图的拓扑排序。
2.PTA实验作业
2.1.题目1:7-1 图着色问题 (25 分)
图着色问题是一个著名的NP完全问题。给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?
但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。
2.1.1设计思路
2.1.2代码截图
2.1.3本题PTA提交列表说明。
·Q1:建树的时候没问题 因为都是按照树上的思路进行建立的 问题出在第一次对于颜色种数的判断方面 没有建立多个数组 导致接下去的数组全部被修改
·A2:按照同学的建议 只要敢建就不怕多 多建了c数组
·Q2:建立数组修改完判断1之后 后面的判断又出问题了 g->a[d[i]][d[j]]1 && e[i]e[j]这个判断条件除了问题 没有加入e数组来临时存放
·A2:百度了一下判断的条件 然后进行修改
2.2.题目2: 7-3 六度空间 (30 分)
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”
2.2.1设计思路
2.2.2代码截图
2.2.3本题PTA提交列表说明。
·Q1:这道题主要思路是深度遍历之后进行判断操作 第一次在跳到下一层的时候没有及时更改最后一个元素的位置 导致错误
·A1:设置一个变量对每一个最后节点进行存储 在进行改变
·Q2:主函数中的输出公式有问题 给不出题目要求的格式和答案
·A2:根据同学的知到进行修改 发现要用%.2f而不是lf
2.3.题目3:7-7 旅游规划 (25 分)
有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。
2.3.1设计思路
2.3.2代码截图
2.3.3本题PTA提交列表说明。
·Q1:这道题的关键在于对于路径的修改和路径权值的计算方面 开始的错误犯在了prim算法对于路径的修改方面 算法实现错误
·A1:搬书上的算法不行 自己再对算法的一些小细节处进行修改 如else if (!know[j] && (min + G[k][j][0] == distance[j]) && (cost + G[k][j][1] < pay[j]))本来是直接按照书上的来写的
·Q2:改完Dijkstra函数之后发现后面搬到pta上显示答案错误 调了很久也找不出错误原因
·A2:后来有大佬建议我输入大一点的值试一试 嘭 系统崩溃 所以在输出的地方加上了判断 在进行输出
3、上机考试错题及处理办法
3.1错题1:6-1 jmu-ds-最短路径 (20 分)
给定一个有向图,规定源点为0,求源点0到其他顶点最短路径。
3.1.1代码截图
本题无操作
3.1.2错误原因及反思
这道题的做法相当于pta编程题的最后一题 也就是上面所写的旅游规划查找路径的题目,因为这道题在上机考试之前没有着重复习 而且在考试的时候分值占比较低 所以就没有去实现代码 这道题的代码其实也不算复杂 关键是印象的问题 做的时候心思都放在了prim算法上面 所以对于最短路径的查找没有重视起来 导致考试的时候也是一脸懵 这道题你确定我们写过??? 以后还是得对于每一处细节都要重视起来 上课的时候讲过的内容得好好复习掌握
3.2错题2:6-3 jmu-ds-拓扑排序 (20 分)
给定一个有向图,求其拓扑序列,若有环路,输出error!
3.2.1代码截图
3.2.2错误原因及反思
这道题我真的是十分的无奈 考试的时候检查了半天都检查不出错误在哪 一点思绪都没有 只有一个测试点是过的 在pta上都能过的代码拿到考试的时候就过不了 一头雾水 检查下来也没什么错误 调试的时候发现输出的地方出了问题 无论输入什么 都只会输出error 可能是flag的改变或者是G->n这个地方被修改了而我没发现 总之这道题真的蛮奇怪的 给同学看了之后他们也找不出什么明显错误 以后的代码如果是背下来的还是的明白其中的道理和每一步的意义在于什么。
3.3错题3:
7-1 六度空间 (20 分)
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。
3.3.1代码截图
3.3.2错误原因及反思
话说这道题也是pta上的原题之一 考试的时候写下去也是不对 后来认真检查了代码 还是有很多地方是有纰漏的 首先是对于变量的定义 其中的i和v变量都没有定义正确 而且在函数当中也没有使用到 这是一个问题 另外在visited这个数组也没有定义和使用正确 最大的问题出在bfs深度遍历函数当中 因为这个题需要对每一层进行遍历 至少我在写pta的时候是这样子做的 后面有同学告诉我另外一种方式 也就是定义其他变量进行存储 似乎也比较方便一点 但是在实现的时候还是出了问题 所以以后同学那边给的代码自己要先看清楚思路是什么 再去敲一遍加深印象
3.4题目4:7-2 公路村村通 (30 分)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
3.4.1代码截图:
3.4.2错误原因及反思
这也是原题之一 当时写这道题的时候只剩下10分钟了 而且前面的两道题目错误也没有检查出来 所以很是着急 一心想的是能不能用什么歪门邪道把测试点套出来一个试试 结果失败告终 老师也在一直说这道题的结构体直接用上面函数题的结构体就可以了 然后接下来只要把prim算法的函数写出来就行了 但是对于prim算法 对他的印象局限于书里的代码 没有看书写出来的代码根本不行 总的来说上课包括课后的很多东西 需要自己再去总结复习把知识转化为自己的理解才行