1.本周学习总结(0--2分)
1.思维导图
2.谈谈你对图结构的认识及学习体会。
本章学习: 图的存储结构 Prim算法和Kruscal算法 拓扑排序
图中的顶点关系比树的更加复杂,不再是单纯的层次关系,而是平等的,点与点都可能连通,所以存储就需要模拟一个平面,在图的关系比较稀疏是用邻接表(使用线性存储),反之使用邻接矩阵,二维数据即可表示出一个平面。图的问题,主要是遍历和路径,难点在于找到相应算法(或者多种算法结合),解决一些实际问题时一般都会对算法进行相应的改动。
图的遍历比较经常用的是深度优先遍历和广度优先遍历。图的深度优先遍历是从初始点v出发,以纵向的方式逐渐访问各个顶点,一旦找不到相邻的顶点就回退,需要递归的过程,广度遍历是类似层次遍历,利用队列来一一访问。
接着就是学Prim算法和Kruscal算法了。Prim和Kruscal算法,Prim算法是多次寻找邻边的权重最小值,而Kruskal是需要先对权重排序后查找的,Kruskal在算法效率上是比Prim快的,因为Kruskal只需一次对权重的排序就能找到最小生成树,而Prim算法需要多次对邻边排序才能找到。两种算法的时间复杂度不同,Prim算法的时间复杂度为O(e^2),Kruskal算法的时间复杂度为O(e^3).
拓扑排序是将一个有向无环图G的所有的顶点排成一个线性序列,使得有向图中的任意的顶点u 和 v 构成的弧,(u, v) 属于该图的边集,并且使得 u 始终是出现在 v 前面。并且只有有向无环图才可以进行拓扑排序。该算法的思想:一:找到有向无环图中没有前驱的节点(或者说是入度为0的节点)输入;二:然后从图中将此节点删除并且删除以该节点为尾的弧。
2.PTA实验作业(6分)
要求挑3道题目写设计思路、调试过程。设计思路用伪代码描述。题目选做要求:
2.1.1设计思路(伪代码)
2.1.题目1:图着色问题
begin:
输入顶点数与边数,颜色数进行建图
输入待检查的颜色分配方案的个数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.第一二次编译错误问题出在void Judge(MGraph g,int n,int sum)函数端口处的for循环中对i的初始化值
Q2.最后稍作修改for循环参数初始化的数值完成编译
A.get到函数端口问题对于程序的影响非常大,稍微的数值改动对程序都是非常关键的,所以算法的选择至关重要
2.2 .1题目2同题目1
begin:
定义n,e
if e>=n-1
for k=0 to e
输入顶点 权值
权值存入邻接矩阵
调用prim函数
else //一定不连通
输出-1
定义数组lowcost
for i=1 to n
lowcost赋初值
for i=0 to n
min=INF
for j=1 to n
if lowcost[j] 且 lowcost[j]<=min
min=lowcost[j];
k=j;
lowcost[k]=0
if min!=INF
count+1
cost+=min
for j=1 to n
修正lowcost数组
if count==n-1
输出cost
else //不连通
输出-1
2.2.2代码截图
2.2.3提交说明
说明:
Q1.部分正确的原因是函数调用中对j的初始化取值取值为0,导致部分答案不符合题目要求
Q2.在void CreateMGraph(MGraph &g,int n,int e )函数中输入邻接矩阵时顺序弄错了
A.做泽中题目事先画图比较实在
2.3 .1题目3
begin:
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.3.2代码截图
2.3.3提交说明
Q1.对于编译错误的情况时因为void CreateAdj()函数的没有定义好参数变量,对i,j所对应要实现的作用没看清楚,导致函数混乱
Q2.主函数中对函数的安排不够严谨
A.六度空间是一道思维量很大的题目,代码虽然少,但是要实现的功能非常多
##3、上机考试错题及处理办法(-2--2分)
##3.1.截图错题代码
错题:6-3 jmu-ds-拓扑排序 (20 分) 7-2 公路村村通 (30 分)
![](https://img2018.cnblogs.com/blog/1477754/201906/1477754-20190609171623497-1554376788.png)
![](https://img2018.cnblogs.com/blog/1477754/201906/1477754-20190609171916617-943313032.png)
##3.2 错的原因及处理方法
错的原因? 我就是不会打啊,考试中只能用cout 的方法拿分虽然这是个测试答案的方法但是不影响我拿分
怎么解决:拓扑排序我参考身上例题打了一遍代码,大概懂了什么意思,而另外一题的话是考试中时间不允许,只能靠方法拿分。。。。
end
文字说明代码中那里错,怎么解决