zoukankan      html  css  js  c++  java
  • 06-图

    1.学习总结

    1.1图的思维导图

    1.2 图结构学习体会

    • 深度遍历算法
      利用深度优先搜索算法可以求得相应拓扑排序表,利用拓扑排序表可以方便的解决很多图有关的问题,像最大路径问题等等。

    • 广度遍历算法
      深度优先遍历是将某一条枝桠上的所有节点都搜索到了之后,才转向搜索另一条枝桠上的所有节点,而广度优先遍历是以层为顺序,将某一层上的所有节点都搜索到了之后才向下一层搜索,所以可以解决像六度空间这类问题

    • Prim和Kruscal算法
      prim函数用到了两个辅助数组,lowcost[k]保存V-U中编号为k的顶点到U中所有顶点的最小权值。closest[k] 保存着U中到V-U中编号为K的顶点权值最小的顶点的编号。这两个数组的元素是随着顶点不断加入U集合而动态变化的。这个算法中采用邻接矩阵法创建图。
      Kruskal算法基于贪心算法,把所有的边按照权值先从小到大排列,接着按照顺序选取每条边,如果这条边的两个端点不属于同一集合,那么就将它们合并,直到所有的点都属于同一个集合为止,合并用到了并查集

    • Dijkstra算法
      Dijkstra算法用于计算一个节点到其他所有节点的最短路径,以起始点为中心向外层层扩展,直到扩展到终点为止。

    • 拓扑排序算法
      如果按照拓扑序列中的顶点次序,在开始每一项活动时,能够保证它的所有前驱活动都已完成,从而使整个工程顺序进行,不会出现冲突的情况,所以适合活动场地的安排,活动顺序的安排等等。

    2.PTA实验作业

    2.1 题目1:图着色问题

    2.2 设计思路

    创建邻接矩阵
    输入要查询的颜色方案种类sum
    for i=0 to i=sum
       定义容器s存放颜色
       循环输入顶点颜色
              如果颜色没出现过,就存入s
              判断顶点颜色总数
                     如果不等于规定的颜色种类,输出No
                     如果等于规定颜色种类
                             从每个顶点出发进行遍历,只要边俩个顶点颜色相同,就结束循环,输出No
              否则输出Yes
    end for
    

    2.3 代码截图



    2.4 PTA提交列表说明。

    写这题遇到俩个难点

    • 怎么判断着色方案可行
      这一题上课有讨论过,就是利用遍历来判断,要判断相邻顶点颜色是否相同,所以利用深度遍历,查找邻接点
    • 怎么计算颜色种类
      判断相邻顶点是否有颜色相同的后,测试数据时发现没有考虑颜色种类的限制。一开始我想的是利用数组,有相同的颜色就不加入,没有就加入数组,最后判断数组长度。但是操作好像有点麻烦,怎么修改结果都不对,思路也没发现哪不对,尝试交了一次,果然答案错了。。。所以百度借鉴了代码,用到了set,利用s.insert存放颜色,s.size()存放颜色种类

    2.1 题目2:六度空间

    2.2 设计思路

    定义顶点数n,边数e
    创建邻接矩阵
    循环每个顶点
         定义变量 i,num,j,count,num用来记录层数,count记录相邻顶点数,初值为1
         定义队列q 
         记录顶点状态,已经访问过
         将顶点入队  
        for num=0 to num=6 
            定义数组 vec  
            队列不为空时
                取队首元素,存入vec,出队队首  
           遍历数组vec
                找到数组元素在图中的边并且另一个顶点没被访问过
                     将顶点入栈,记录顶点已经被访问   
                        count++
    六层循环结束后
        计算比例  
    

    2.3 代码截图


    2.4 PTA提交列表说明。


    我想的是找到顶点的邻接点,这些邻接点再继续找它们的邻接点,一直这样找下去,找六次。这些所有找到的顶点数和总数的比值就是我们要求的,一开始用的是数组记录,但是结果不对,我有输出每一次找到的顶点数,和用容器输出的差别很大,每次都是1,后来也改用了容器,但是不理解为什么都有memset( visit, 0, sizeof(visit[0])*(n+1)),而且删了结果就不对了,循环次数好像少了

    2.1 题目3:道路村村通

    2.2 设计思路

    	输入顶点数和边数
    	如果边数小于顶点数减一,输出-1
    	否则
    		构建邻接数组
                    定义距离数组dis和存放前一个顶点的数组pre
                    对顶点数组pre初始化,都为-1
                    距离数组dis初始化,为顶点1到其他顶点的距离
                    给dis[1]赋值为0,pre[1]赋值为0
    	        循环变量i从顶点2到顶点n 
    	       在所有顶点中找出离顶点i最近的顶点,记录最近编号k,修改距离为最短距离
                   记录顶点k前一个顶点i    
                   累加每次找到的最短距离  
                   遍历距离数组,如果图中存在到达该顶点更小的距离,要修改数组  
                   如果最终距离和大于INF说明图不连通,输出-1
                   否则输出距离
    

    2.3 代码截图


    2.4 PTA提交列表说明。



    没有考虑图不连通和构不成图的情况

    • 图不连通
      因为初始化为INF,所以图不连通的话,路径和一定大于INF
    • 构不成图
      一开始没想到可以用顶点数和边数的关系来判断,要想构成连通图,至少有顶点数-1的边数

    3.截图本周题目集的PTA最后排名

    3.1 PTA排名

    3.2 我的总分:1.5

    4. 阅读代码

    代码:求俩条路线,一条是最快到达路线,一条是最短距离的路线

    代码链接:https://blog.csdn.net/m0_38015368/article/details/78450727

    • 带权邻接矩阵的初始化,对角是0,其余为无穷大
    • 路径利用了递归,推导出所有顶点之间的最短路径
    • 注意修改最短路径
    • 核心算法是弗洛伊德算法
  • 相关阅读:
    Python中字符的练习
    Python中的数据结构 --- 集合(set)
    Python中的数据结构 --- 元组(tuple)、字典(tuple)
    Python中的数据结构 --- 列表(list)
    Python变量、字符练习1
    Python中字符串的操作
    Python中for、while、break、continue、if的使用
    Python中的变量
    Python中注释的添加
    Python的介绍及Pycharm软件的安装
  • 原文地址:https://www.cnblogs.com/tajiyu/p/9188853.html
Copyright © 2011-2022 走看看