博客作业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. 阅读代码

贝尔曼-福特算法

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

posted @ 2018-06-17 20:17  Airoure  阅读(307)  评论(0编辑  收藏  举报