zoukankan      html  css  js  c++  java
  • 博客作业06--图

    1.学习总结

    1.1图的思维导图

    1.2 图结构学习体会

    深度遍历算法

    深度优先遍历,是对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。

    广度遍历算法

    广度优先遍历,也是对连通图遍历的算法。它的思想是从一个顶点V0开始,先遍历和它直接相连的点,再把这些点入栈,再从栈中取出点重复上述操作,这种尽可能多访问节点的概念就是广度优先遍历,深度优先和广度优先都是图常用的遍历算法,适用于不同情况。

    Prim和Kruscal算法

    这两种算法都是求图的最小生成树的算法,prim算法:从一个点出发,先找到和它距离最近的点,把他们归入一个集合,再找和这个集合最近的点再加入这个集合,重复以上操作。Kruscal算法:先把图中的边按顺序排好,再找不会形成回路的边,重复以上操作,我觉得prim算法会更好用一点

    Dijkstra算法

    用于求图中最短路径的算法,设G = (V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的定点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径V,..,K,就将k加入集合S中,直到所有定点都加入S中,算法结束),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组中顶点加入S

    拓扑排序算法

    设G = (V,E)是一个具有n个定点的有向图,V中顶点序列V1,V2,V3....Vn为一个拓扑序列并且当且仅当该顶点序列满足下列条件:若<V1,Vi>是图中的边,则在序列中V1在Vi之前,这样的过程叫做拓扑排序,拓扑排序有广泛的应用。

    2.PTA实验作业

    题目1:7-3 六度空间

    设计思路

        BFS(int v,int n,int e){
            count表示六度空间访问点个数,last记录当前层最后一个元素
            初始化visited数组
                visited[v] = 1表示当前点已访问
                初始化front = rear = -1 队列为空
                V入栈
                last = v记录当前层最后的点
                while(队列不空)
                        V = 队首元素
                        for (i = 1 to i = n)
                            if(i未访问&&i于v点有边)
                                    i入栈,visited[i] = 1,tail = i,count++
                            end if
                        if (v是单前层最后一个元素)level++,last = tail
                        end if
                  end while
                return count
    

    代码截图


    PTA提交列表说明


    其中的段错误和部分错误都是因为数组定义的不够大,这一题难就难在判断他的层数,当时也是看了百度的
    代码才懂得用last记录当前层最后一个点

    题目2:7-4 公路村村通

    设计思路

    int prim(MGraph g){
            lowcost数组记录和其他点最近距离,cost记录总成本
            lowcost[1] = 0出发点本身距离不存在,记为0
            for(i = 2 to i = g.n)
                lowcost[i] = g.edges[1][i]初始点的最近距离
            end for
            for(i = 2 to i= g.n)
                min = 100001
             while(j<=g.n)
                 if(路径存在&&路径<min)
                    min = lowcost[j];
    				k = j;
                 if(找不到最近的点)return -1
              cost+=min
              lowcost[k] = 0表示k点加入该集合
              修正lowcost数组判断新加入的点是否有
               与未加入集合点更近的   
          }
    

    代码截图


    PTA提交列表说明


    部分正确是在建表的时候吧不存在的边赋值为0,这是不对的,改了之后就正确了

    题目3:7-7 旅游规划

    设计思路

    void Dijkstra(int v,int n,int e,int end){
        定义dist数组存放距离path数组存放路径cost数组存放消费
        定义s数组存放加入集合的点
        先初始化这几个数组
        将V加入s数组,path[v] = 0
        	mindis = INF;
    		for(j = 0 to j < n)
    			if(j未加入集合且dist[j]存在)
    				u = j;
    				mindis = dist[j];
    			end if
    		end for
    		s[u] = 1;
    		for(j = 0 to j < n)
    			if(j加入 集合)
    				if(新加入点距离比原来近)
    					更新dist[j],path[j],cost[j]
    				else if(新加入点距离和原来一样近但比较便宜)
    					更新dist[j],path[j],cost[j]	
    

    代码截图


    PTA提交列表说明


    部分正确是因为没有把不存在的边等于INF,导致后续比较会出现问题

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

    3.1 PTA排名

    3.2 我的总分244

    4. 阅读代码

    贝尔曼-福特算法

    贝尔曼-福特算法与迪杰斯特拉算法类似,迪杰斯特拉算法以贪心法选取未被处理的具有最小权值的节点,然后对其的出边进行操作;而贝尔曼-福特算法简单地对所有边进行操作,我觉得迪杰斯特拉算法更好一点,但贝尔曼-福特算法也不失为一种好思路

  • 相关阅读:
    KMP
    KMP算法的Next数组详解
    从头到尾彻底理解KMP
    通信协议:HTTP、TCP、UDP
    十大Intellij IDEA快捷键
    Java连接oracle数据库的两种常用方法
    Oracle 数据类型
    Oracle 数据库、实例、用户、表空间、表之间的关系
    Android中的Handler的机制与用法详解
    在Android开发中,定时执行任务的3种实现方法
  • 原文地址:https://www.cnblogs.com/Airoure/p/9191728.html
Copyright © 2011-2022 走看看