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,其余为无穷大
    • 路径利用了递归,推导出所有顶点之间的最短路径
    • 注意修改最短路径
    • 核心算法是弗洛伊德算法
  • 相关阅读:
    leetcode 268. Missing Number
    DBSCAN
    python二维数组初始化
    leetcode 661. Image Smoother
    leetcode 599. Minimum Index Sum of Two Lists
    Python中的sort() key含义
    leetcode 447. Number of Boomerangs
    leetcode 697. Degree of an Array
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(1月3日)
    北京Uber优步司机奖励政策(1月2日)
  • 原文地址:https://www.cnblogs.com/tajiyu/p/9188853.html
Copyright © 2011-2022 走看看