第零次作业


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,但是为什么导致我考试时候遇见的问题我也没有深究),改正后可以通过。而后面的六度空间等题目在上面我也详细地讲过了,这里就不再写一遍了


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM