首页 > 其他 > 详细

博客作业06--图

时间:2018-06-17 23:10:52      阅读:357      评论:0      收藏:0      [点我收藏+]

一、学习总结

1.1、图的思维导图

技术分享图片

1.2、图结构学习体会

深度遍历算法

  • 使用递归方式,一个结点再往下一个结点的遍历,不遍历已访问过的结点

广度遍历算法

  • 用队列的方式,将一个结点的周边结点扫入队列中,再按出队的顺序依次访问,重复操作。

Prim和Kruscal算法

  • 都是生成最小生成树的算法。
  • Prim 算法从任意一个顶点开始,每次选择一个与当前顶点集最近的一个顶点,并将两顶点之间的边加入到树中。Prim 算法在找当前最近顶点时使用到了贪婪算法。
  • Kruscal 算法原理:首先,将每个顶点放入其自身的数据集合中。然后,按照权值的升序来选择边。当选择每条边时,判断定义边的顶点是否在不同的数据集中。如果是,将此边插入最小生成树的集合中,同时,将集合中包含每个顶点的联合体取出,如果不是,就移动到下一条边。重复这个过程直到所有的边都探查过。

Dijkstra算法

  • 特征:使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。
  • 原理:按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度

拓扑排序算法

  • 通常是决定项目工期的进度活动序列,是项目中最长的路径,一个项目可以有多个、并行的关键路径。关键路径的工期决定了整个项目的工期,任何关键路径上的终端元素的延迟在浮动时间为零或负数时将直接影响项目的预期完成时间(例如在关键路径上没有浮动时间)。

二、PTA实验作业

2.1.1、7-1 图着色问题

2.1.2、设计思路

    用二维数组 es[e][2] 存放输入的边集// e 是输入的行数
    while (颜色分配方案 m-- 不为0)
        color 数组存放每个结点对应的颜色,flag 等于 1 作为标志
        用 map<int,int> col 统计输入颜色的个数
        输入 color 数组的内容,并把对应的 col 内容置为1
        if ( col 的元素个数不等于 k ) 输出 “No” ;
        else
            for(遍历边集 es )
                if ( es 的同一行的两个元素对应的颜色相同 )
                    输出 “No”,flag 等于 0
                if ( flag 为真 )
                    输出 “Yes”
            end for
    end while

2.1.3、代码截图

技术分享图片
技术分享图片

2.1.4、PTA提交列表说明

技术分享图片

  • 之前没想到可以用边集来判断,用了邻接表、邻接矩阵存放边,用 DFS、BFS 来判断,于是很多错的。
  • 后来发现只需要对颜色的个数特别判断,另外的可以循环判断边集的结点颜色是否相等,就通过了。

2.2.1、7-4 公路村村通

2.2.2、设计思路

    MAX 定义为 1050
    邻接矩阵 edge [MAX][MAX] ,Vnum 统计遍历过的结点数,sum 存放路径和
    将 low 数组初始化为邻接矩阵中起始点的那一行
    for  i = 0  to  n-1
        min = MAX,k;
        遍历 low 数组,找到数组中最小且不为 0 的边,将 min 定位到这个边的权重,k 定位到这个边在数组中的位置
        if( min == MAX ) 说明没有边,结束循环
        sum 加上最小边,low 数组中 k 位置设为 0 ,Vnum 记录遍历的结点数
        for  j = 1   to   n
            if( low[j] 存在且 edge[k][j] 小于 low[j] )把 low[j] 的值更新为 edge[k][j] 的值
        end for j
    end for i
    if ( Vnum 不等于 n )输出 -1
    else    输出 sum 的值

2.2.3、代码截图

技术分享图片
技术分享图片

2.2.4、PTA提交列表说明

技术分享图片

  • 应该使用普里姆算法,但是一开始写的时候没想到。
  • 没有在普里姆算法里加上if (min==MAX)一句,然后就错了。

2.3.1、7-7 旅游规划

2.3.2、设计思路

    MAX 取值为 550
    邻接矩阵 edge[MAX][MAX] 存放 距离 权重;邻接矩阵 costs[MAX][MAX] 存放 路费 权重,最短路径数组 dist[MAX],最小花费数组 cost[MAX],记录遍历结点的数组 visited[MAX] = { 0 }
    将 dist 数组初始化为初始点的 edge 的那一行,cost 数组初始化为初始点的 costs 的那一行
    将初始点的 dist 归零,对应的 visited 数组位置置为 1
    for  i = 0  to  n-2
        min = MAX,k;
        遍历 dist 数组,找到数组中最小且对应结点未被遍历的边,将 min 定位到这个边的权重,k 定位到这个边在数组中的位置
        将 k 结点的 visited 置为 1 
        for  j = 0   to   n-1
            if( j 结点未被遍历且初始点到 k 结点的距离加上 k 结点到 j 结点的距离比初始点到 j 结点的距离小)    更新 dist[j] 为 dist[k]+edge[k][j]
            else if( j 结点未被遍历且 dist[j] == dist[k]+edge[k][j] 且 costs[k][j]+cost[k] 小于 cost[j] )    更新 cost[j] 为 costs[k][j]+cost[k] 
        end for j
    end for i

2.3.3、代码截图

技术分享图片
技术分享图片

2.3.4、PTA提交列表说明

技术分享图片

  • 这里的三次错误是因为输出的地方,要输出的是 dist[d] 和 cost[d],我把 d 输出了。

三、截图本周题目集的PTA最后排名

3.1、PTA排名

技术分享图片

3.2、我的得分:2.5

四、阅读代码

博客作业06--图

原文:https://www.cnblogs.com/linyue711/p/9178283.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!