DS博客作业06--图
1.本周学习总结(0--2分)
1.1思维导图
1.2.谈谈你对图结构的认识及学习体会。
图中的顶点关系比树的更加复杂,不再是单纯的层次关系,而是平等的,点与点都可能连通,所以存储就需要模拟一个平面,在图的关系比较稀疏是用邻接表(使用线性存储),反之使用邻接矩阵,二维数据即可表示出一个平面。图的问题,主要是遍历和路径,难点在于找到相应算法(或者多种算法结合),解决一些实际问题时一般都会对算法进行相应的改动。
对于图首先学到的就是它的遍历,图的遍历比较经常用的是深度优先遍历和广度优先遍历。图的深度优先遍历是从初始点v出发,以纵向的方式逐渐访问各个顶点,一旦找不到相邻的顶点就回退,需要递归的过程,广度遍历是类似层次遍历,利用队列来一一访问。
接着就是学Prim算法和Kruscal算法了。Prim和Kruscal算法,Prim算法是多次寻找邻边的权重最小值,而Kruskal是需要先对权重排序后查找的,Kruskal在算法效率上是比Prim快的,因为Kruskal只需一次对权重的排序就能找到最小生成树,而Prim算法需要多次对邻边排序才能找到。但是个人是比较喜欢Prim算法的。
然后也学习了Dijkstra算法。该算法是在无向图 G=(V,E) 中,假设每条边 E 的长度为 w,找到由顶点 V0 到其余各点的最短路径。其主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
最后就是学习拓扑排序了,拓扑排序是将一个有向无环图G的所有的顶点排成一个线性序列,使得有向图中的任意的顶点u 和 v 构成的弧,(u, v) 属于该图的边集,并且使得 u 始终是出现在 v 前面。并且只有有向无环图才可以进行拓扑排序。该算法的思想:一:找到有向无环图中没有前驱的节点(或者说是入度为0的节点)输入;二:然后从图中将此节点删除并且删除以该节点为尾的弧。
2.PTA实验作业(6分)
要求挑3道题目写设计思路、调试过程。设计思路用伪代码描述。题目选做要求:
2.1.题目1:7-1 图着色问题 (25 分)
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提交列表说明。
PTA提交列表中的每个错误详细说明为什么及如何解决。
- Q1:此题既需要考虑颜色是否够用,又要考虑相邻颜色是否一样,刚开始未考虑全,答案错误。
- A1:增加代码进行判断相邻颜色是否一样。
- Q2:设定flag来判断输出结果时设置错误
- A2:修改flag不同值对应的不同结果
2.2.题目2:题目名称 7-3 六度空间 (30 分)
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提交列表说明。
PTA提交列表中的每个错误详细说明为什么及如何解决。
-Q1一开始的算法思路不对,导致只能过一个测试点
-A1后来去问到了这种判断层次的思路才过了所有测试点
-Q2 忘记函数忘记return了
-A2 调整代码即可
2.3.题目3:题目名称 7-6 修建道路 (30 分)
2.3.1设计思路(伪代码)
int main()
{
for (i=1 to N)
{
for (j = 1 to N)
{
读入村庄之间的距离到矩阵中
}
}
for (i = 0 to q)
{
读入已经修有路的村庄
graph[a][b] = graph[b][a]=0设置距离为零
}
调用prim函数
输出最小修路长度
return 0;
}
prim函数
int Prim(int v)
{
for (i = 1 to N)N个村庄
{
对lowcost和closest数组初始化
lowcost[i] = graph[v][i]距离
closest[i] = v路径
}
visite[v] = 1标记已经加入U
for (i = 1 to N)
{
for (j = 1 to N)
{
查找lowcost中未加入U(即visite[j]=0)最小的点
用k记录
}
找到后把距离累加到sum中
把该点标记已经加入U
for (int j = 1; j <= N; j++)
{
修改lowcost和closet
if (visite[j]== 0 && graph[k][j] < lowcost[j])如果通过k到未选的点有短的距离
{
lowcost[j] = graph[k][j];
closest[j] = k;
}
}
}
返回return sum;
}
2.3.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)
2.3.3本题PTA提交列表说明。
PTA提交列表中的每个错误详细说明为什么及如何解决。
-这题调试了很久,很幸运一次提交就满分了。
3、上机考试错题及处理办法(-2--2分)
3.1.题目:六度空间
3.1.1截图错题代码
3.1.2 错的原因及处理方法
本人水平有限,做不出来,只能在网上学习这份代码,
自己的代码一开始编译有问题,后来输出不出来出现程序崩溃.
这题其实并不难,可能是在想6.1想太久了,这题六度空间用一个广度遍历遍历出所有的节点数并控制它小于六就好了
3.2.题目: jmu-ds-最短路径
3.2.1截图错题代码
3.1.2 错的原因及处理方法
错误原因:找第一个相邻结点入度为0的相邻顶点进栈,找下一个相邻结点时设计出错
处理方法:明确思路:栈ST的指针为top;入度置初值0;求所有顶点的入度;入度为0的顶点进栈;栈不为空时,入度为0的顶点进栈,出栈,输出顶点,找第一个相邻结点;入度为0的相邻顶点进栈,找下一个相邻结点。然后更改找下一个结点的指针,解决问题。