DS博客作业06--图
1.本周学习总结
1.思维导图
2.谈谈你对图结构的认识及学习体会。
本章是对图的学习,本以为图会十分复杂,至少比树是要复杂的,没想到会比树好操作一点,主要是递归少,而且结构常用的就是邻接表和邻接矩阵。虽说比树简单一点,但还是会碰到一些问题,尤其是学习到Prim算法和Dijkstra算法,若不是反复多遍的看课本加上上课认真听课和经过课堂派的预习,真的不好理解。在pta的练习中,也是用了比较久的时间去完成作业,虽然没有遇到太大的坎坷,但耗时相比其他同学相对较高,这也许是代码的缺陷吧,关键路径也不太简单,不过没有代码要求,也算是减轻了一些难度,总之多刷题,bug改多了,准确率便高了。
2.PTA实验作业
2.1.题目1:7-1 图着色问题
2.1.1设计思路(伪代码)
Judge函数传入邻接表G,数组s //s数组存各个结点的颜色,在main中已经判断颜色种类符合题意 定义整型i,v for v=1 to v=G->n do p指向以结点v为头结点的第一个边结点 while p不为NULL do if 结点v的颜色s[v]与p结点的颜色相同 then 输出No并退出函数 end if p指向下一个结点 end while end for 输出Yes
2.1.2代码截图
2.1.3本题PTA提交列表说明。
Q1:本题是深度遍历的练习,刚开始也是往深度遍历,写的过程中发现其实直接对邻接表中链表逐一进行遍历就可以
A1:所以我就用此方法很快就写完了
Q2:提交后发现有一个测试点没过
A2:原来颜色数目少于题目要求也是错的,然后就过了
2.2 题目2:7-3 六度空间
2.2.1设计思路(伪代码)
judge函数传入邻接表G 定义边结点指针p 定义整型i,count,v,flag,count1 定义整型数组t[10000] 定义队列s for v=1 to v=G->n do //遍历结点 count=0,count1=1 //初始化 将v结点入队 t[v]=v //为了不用对数组进行重置,所以令其为v flag=v //flag存每一层最后一个结点 while 队列不空 do p指向以队列第一个元素为头结点的第一个边结点 while p不为NULL do if t[p->adjvex]!=v then //即p结点还没有被访问过 将p结点的值入队 t[p->adjvex]=v //置为已访问 count1++ //记录访问结点总的个数 end if p指向下一个边结点 end while if 队头元素与flag相等 then count++ //访问深度 flag等于队尾 end if if count==6 then break 队列出队一次 end while 输出百分比 //count1除于总结点个数 队列清空
2.2.2代码截图
2.2.3本题PTA提交列表说明。
Q1:本题在陆大机房就开始尝试,当时图结构还不是很熟悉,打的巨慢,而且不知道如何进行遍历
A1:代码拿回来,之后想到用广度遍历可以比较好的解决这个问题
Q2:写完后,自己感觉也没啥问题,一提交,测试点有一个过不了,而且是运行时错误
A2:只能对代码进行再次修改,把循环从3层换成了两次,经过多次尝试最后通过
2.3 题目3:7-7 旅游规划
2.3.1设计思路(伪代码)
Dijkstra函数传入邻接表G,开始结点Begin,结束结点End 定义整型v,i,k,MIN1,MIN2 定义边结点指针p 定义整型数组dist1[1000],path[1000],dist2[1000] 定义整型数组visited[1000] for i=0 to i=G->n-1 do 对dist1,dist2,path数组初始化 end for v=Begin,dist1[v]=0,dist2[v]=0 while 1 do MIN1=MIN2=1000000 //初值 for i=0 to i=G->n-1 do //找dist1最小结点,若相等则找dist2较小的 if MIN1>=dist[i]且visted[v]不为1 then if MIN1>dist1[i]或MIN2>dist2[i] then MIN1=dist1[i],MIN2=dist2[i],v=i end if end if end for if v==End then break //结束 visted[v]=1 //表示已经选择过的结点 p指向以v为头结点的第一个边结点 while p不为NULL do //修改dist1和dist2 if p->length + dist1[v]<=dist1[p->adjvex] then if p->length+dist1[v]<dist1[p->adjvex]或p->price+dist2[v]<dist2[p->adjvex] then 对dist1,dist2,path 进行修改 end if end if p指向下一个结点 end while endwhile 输出dist1[v]和dist2[v]
2.3.2代码截图
2.3.3本题PTA提交列表说明。
Q1:这一题主要问题是对Dijkstra算法的使用,这个算法刚接触比较陌生,写本题代码时一时无从下手
A1:看了课本,发现本题的代码用课本里的代码改造一下即可,最后在自己写一遍,经过多次调试过了
3、上机考试错题及处理办法
3.1.1截图错题代码:7-1 六度空间
3.1.2 错的原因及处理方法
此题错的非常可惜,把64句删掉就可以过。(陆大216的编译器真心不行。。。)
3.2.1截图错题代码:6-1 jmu-ds-最短路径
此题上机课没打
3.2.2 错的原因及处理方法