DS博客作业06--图

1.本周学习总结(0--2分)

1.思维导图

2.学习体会。

深度遍历DFS通过递归实现,代码简洁,广度遍历BFS通过队列实现,代码略长。都是对图的遍历,两种都行,有不同的作用。
prim算法用来求最小生成树,用lowcost数组存放最小的路可以说是很巧妙地算法,有点长,有点难背,求最短生成树时还能用卡鲁斯卡尔算法。
Dijkstra算法用来求最短路径,通过path数组存放前驱,dist数组存放从初始点到下标点的权值,更加的巧妙,同样求最短路径还可以用弗洛伊德算法。
拓扑排序可以用栈也可以用队列,通过在结构体新加一个变量表示入度来实现。

2.PTA实验作业(6分)

2.1.题目1:7-1 图着色问题

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提交列表说明。

  • Q1:此题既需要考虑颜色是否够用,又要考虑相邻颜色是否一样,刚开始未考虑全,答案错误。
  • A1:增加代码进行判断相邻颜色是否一样。
  • Q2:设定flag来判断输出结果时设置错误
  • A2:修改flag不同值对应的不同结果

2.2 题目2:六度空间

2.2.1设计思路

int bfs(int v)  
{  
    初始化队列
    while(队不空)  
    {  
       出队元素z
        for  i=1 to 顶点数
        {  
            若g[z][i]==1 && vis[i]==0
            {  
                count++;  
               把i进队
                tail=i;  
            }  
        }  
       若v为该层最后一个结点
        {  
            层数++
            更新层末的顶点
        }  
       若层数为6
            跳出循环
    }  
    返回count的值
} 

 

2.2.2代码截图

 

2.2.3本题PTA提交列表说明。

  • Q:以老师讲的思路设计bfs函数去实现代码,但有些困难,写的代码改了好久还是答案错误。
  • A:询问同学自己代码的错误点,改正后正确。

2.3 题目3:7-4 公路村村通

2.3.1设计思路

int Prim(int S,int v)//prim算法计算最短路径 
{
   定义循环变量V;for V=1 to 顶点数 {
    dist[V]=G[1][V];
  } 
    while(1)
    {

    以allweight更新记录权值长度
      dist[V]=0;
在findmin函数
中找出离各村最近的顶点 minV记录最近顶点的编号,return回去给V
     找完时跳出循环 }
返回allweight的值 }

 

2.3.2代码截图

 

2.3.3本题PTA提交列表说明。

  •  Q1:此题用常规的prim算法来做,有些测试点过不去,一直部分正确或多种错误。
  • A1:在常规的prim算法中加入findmin函数来找最短距离,并更改prim算法的设计格式。
  • Q2:在函数调用方面出现问题,函数return回去值后会计算错误。
  • A2:更改后答案正确。

3、上机考试错题及处理办法

3.1.1截图错题代码 6-1 jmu-ds-最短路径

 

此题在考试时未能想出来解决办法,就按一般的dikstra算法来打,但是没能想出如何与已给函数结合,分数未拿到。

 

3.2.1 错的原因及处理方法

了解dikstra算法的基本思想:设置一个集合S存放已经找到最短路径的顶点,S的初始状态只包含源点v,对vi∈V-S,假设从源点v到vi的有向边为最短路径。以后每求得一条最短路径v, …, vk,就将vk加入集合S中,并将路径v, …, vk , vi与原来的假设相比较,取路径长度较小者为最短路径。重复上述过程,直到集合V中全部顶点加入到集合S中。配合已给的void Dispath(int dist[],int path[],int s[],int n,int v);void Ppath(int path[],int i,int v);void PrintMGraph(MGraph g); 三个函数,并请教同学,将此题解决。

3.1.2截图错题代码   jmu-ds-拓扑排序

3.2.2 错的原因及处理方法

错误原因:找第一个相邻结点入度为0的相邻顶点进栈,找下一个相邻结点时设计出错

处理方法:明确思路:栈ST的指针为top;入度置初值0;求所有顶点的入度;入度为0的顶点进栈;栈不为空时,入度为0的顶点进栈,出栈,输出顶点,找第一个相邻结点;入度为0的相邻顶点进栈,找下一个相邻结点。然后更改找下一个结点的指针,解决问题。

3.1.3 六度空间

3.3.2 错的原因及处理方法

原因:以老师讲的思路设计bfs函数去实现代码,但有些困难,写的代码改了好久还是答案错误。

方法:询问同学自己代码的错误点,改正后正确。

posted @ 2019-06-02 19:01  郭坤  阅读(148)  评论(0编辑  收藏  举报