1.本周学习总结
1.1思维导图
1.2学习体会
本章学习了图,图的定义,图的存储结构,图的遍历以及最小生成树,最短路径,拓扑排序等算法,学习图的存储结构比较容易,但在学习普里姆最小生成树和狄克斯特最短路径时花费的时间较多,对于这种复杂的算法,需要慢慢地理解其思路然后再学习代码的写法。
2.PTA实验作业
2.1 题目1:7-1 图着色问题
2.1.1设计思路
建立邻接矩阵g
将颜色存入到数组a[]中
for i=1 to i=n
for j=1 to j=n
if(if(a[i]==a[j]&&g[i][j]==1) flag=0 //对于每一个条边g[i][j],其两个顶点的颜色分别位a[i]和a[j],若有a[i]=a[j],则可判断不满足条件
2.1.2代码截图
2.1.3本题PTA提交列表说明
1.部分正确是因为没注意题目要求颜色数要等于输出的颜色数N
2.所以后面加了c[]数组判断颜色数
2.2 题目2:7-3 六度空间
2.2.1 设计思路
建立邻接表g
用广度遍历的方法遍历g
visited[]数组来判断结点时否被访问过,访问过就为1,否则为0
定义(int) temp,tail,last=x三个变量,x是参数,该函数作用是“输出与x结点距离不超过6的结点数”,第一层的最后一个结点就是x,所以laxt=x
定义(int) sum 变量用于储存与x结点距离不超过6的结点数
queue<int> q;//新建一个队列q
q.push(x)//先将x放入队列中
visited[x]=0;
while(!q.enmpty())//当q不为空时
{
temp=q.front();
p访问q中队头所对应的邻接表结点
q.pop();
while(p!=NULL)
{
如果p未被访问 {入队,sum++,visited[(p->adjvex)]=1,tail=p->adjvex//这样子当访问到最后该层的最后一个结点时,tail储存的会是下一层最后一个结点的位置 }
p=p->nextarc //p访问p的下一个邻接点
}
if(temp=last) {level++;last=tail //tail此时找到了下一层结点的最后一个元素位置,将其值给last}
}
结果return sum
2.2.2 代码截图
2.2.3本题PTA提交列表说明
1.一开始的算法思路不对,导致只能过一个测试点,后来去问到了这种判断层次的思路才过了所有测试点
2.编译错误就是用了c提交,为什么会这样我也不知道
2.3 题目3:7-6 修建道路
2.3.1 设计思路
建立邻接矩阵g
将已经连通的道路的价格g.price[i][j]变成0;
最后用普里姆算法即可计算最少花费(普里姆算法这里就不详细解说)
2.3.2 代码截图
2.3.3本题PTA提交列表说明
1.一开始的思路是把已经连通的路的顶点放入v集合中,然后再计算最少消费。但是后来发现这样做的话v集合中的顶点不一定个个连通,也就是v集合不一定连通,导致后面全错
2.后来在别人指导下,把已经连通的路的修路费用改成0,然后再用普里姆算法计算最少消费
3、上机考试错题及处理办法
3.1 6-2 jmu-ds-图邻接表操作错误代码
错误代码
改正后得到代码
错误就错在这里
少了G->n=n;
G->e=e;
由于本人比较偏向完美主义,做不过的题目不想跳过。所以只写了 第一题最短路径,卡在第二题卡了一节课,考试结束后通过和练习比对发现只是少了G->n=n;G->e=e;两行代码,(但是考试的时候我通过调试发现的却是visited在第二次运行函数是没有初始化导致的,虽然主函数已经有for(i=1;i<=G->n;i++) visited[i]=0这个语句,但是我在随后运行的BFS()函数中查了一下visited[]的值全部输出1,但是出去比对以后发现是少了G->n=n;G->e=e,但是为什么导致我考试时候遇见的问题我也没有深究),改正后可以通过。而后面的六度空间等题目在上面我也详细地讲过了,这里就不再写一遍了