DS博客作业06--图
1.本周学习总结(0--2分)
1.思维导图
2.学习体会。
深度遍历DFS通过递归实现,代码简洁,广度遍历BFS通过队列实现,代码略长。都是对图的遍历,两种都行,有不同的作用。
prim算法用来求最小生成树,用lowcost数组存放最小的路可以说是很巧妙地算法,有点长,有点难背,求最短生成树时还能用卡鲁斯卡尔算法。
Dijkstra算法用来求最短路径,通过path数组存放前驱,dist数组存放从初始点到下标点的权值,更加的巧妙,同样求最短路径还可以用弗洛伊德算法。
拓扑排序可以用栈也可以用队列,通过在结构体新加一个变量表示入度来实现。
2.PTA实验作业(6分)
2.1.题目1:7-1 图着色问题
2.1.1设计思路
输入顶点数与边数,颜色数进行建图 输入待检查的颜色分配方案的个数n for( ;n;n--){ for i=1 to 顶点数{ 输入颜色的分配方案,统计所用颜色总数num } 若统计的颜色总数num!=题干的颜色数 则把flag由0赋为1 } 将颜色按深度遍历排序储存在数组中 for i=1 to 顶点数{ for j=1 to 顶点数{ 若有相邻的颜色相同 则把flag的值由0赋为1 } flag值已为1即已有相邻颜色相同停止循环 } 如果flag=1 输出no 否则 输出yes
2.1.2代码截图
2.1.3本题PTA提交列表说明。
- Q1:此题既需要考虑颜色是否够用,又要考虑相邻颜色是否一样,刚开始未考虑全,答案错误。
- A1:增加代码进行判断相邻颜色是否一样。
- Q2:设定flag来判断输出结果时设置错误
- A2:修改flag不同值对应的不同结果
2.2 题目2:六度空间
2.2.1设计思路
int bfs(int v) { 初始化队列 while(队不空) { 出队元素z for i=1 to 顶点数 { 若g[z][i]==1 && vis[i]==0 { count++; 把i进队 tail=i; } } 若v为该层最后一个结点 { 层数++ 更新层末的顶点 } 若层数为6 跳出循环 } 返回count的值 }
2.2.2代码截图
2.2.3本题PTA提交列表说明。
- Q:以老师讲的思路设计bfs函数去实现代码,但有些困难,写的代码改了好久还是答案错误。
- A:询问同学自己代码的错误点,改正后正确。
2.3 题目3:7-4 公路村村通
2.3.1设计思路
int Prim(int S,int v)//prim算法计算最短路径 { 定义循环变量V;for V=1 to 顶点数 { dist[V]=G[1][V]; }
while(1)
{
以allweight更新记录权值长度
dist[V]=0; 在findmin函数中找出离各村最近的顶点 minV记录最近顶点的编号,return回去给V
找完时跳出循环 } 返回allweight的值 }
2.3.2代码截图
2.3.3本题PTA提交列表说明。
- Q1:此题用常规的prim算法来做,有些测试点过不去,一直部分正确或多种错误。
- A1:在常规的prim算法中加入findmin函数来找最短距离,并更改prim算法的设计格式。
- Q2:在函数调用方面出现问题,函数return回去值后会计算错误。
- A2:更改后答案正确。
3、上机考试错题及处理办法
3.1.1截图错题代码 6-1 jmu-ds-最短路径
此题在考试时未能想出来解决办法,就按一般的dikstra算法来打,但是没能想出如何与已给函数结合,分数未拿到。
3.2.1 错的原因及处理方法
了解dikstra算法的基本思想:设置一个集合S存放已经找到最短路径的顶点,S的初始状态只包含源点v,对vi∈V-S,假设从源点v到vi的有向边为最短路径。以后每求得一条最短路径v, …, vk,就将vk加入集合S中,并将路径v, …, vk , vi与原来的假设相比较,取路径长度较小者为最短路径。重复上述过程,直到集合V中全部顶点加入到集合S中。配合已给的void Dispath(int dist[],int path[],int s[],int n,int v);void Ppath(int path[],int i,int v);void PrintMGraph(MGraph g); 三个函数,并请教同学,将此题解决。
3.1.2截图错题代码 jmu-ds-拓扑排序
3.2.2 错的原因及处理方法
错误原因:找第一个相邻结点入度为0的相邻顶点进栈,找下一个相邻结点时设计出错
处理方法:明确思路:栈ST的指针为top;入度置初值0;求所有顶点的入度;入度为0的顶点进栈;栈不为空时,入度为0的顶点进栈,出栈,输出顶点,找第一个相邻结点;入度为0的相邻顶点进栈,找下一个相邻结点。然后更改找下一个结点的指针,解决问题。
3.1.3 六度空间
3.3.2 错的原因及处理方法
原因:以老师讲的思路设计bfs函数去实现代码,但有些困难,写的代码改了好久还是答案错误。
方法:询问同学自己代码的错误点,改正后正确。