首页 > 其他 > 详细

博客作业06--图

时间:2018-06-17 21:43:28      阅读:340      评论:0      收藏:0      [点我收藏+]

1.学习总结(2分)
1.1图的思维导图
技术分享图片

1.2 图结构学习体会
谈谈你对图结构中的几个经典算法学习体会。具体有:

深度和广度比较简单,一个递归,一个用队
Prim和Kruscal算法,理解的话还是可以理解,但是代码写起来就没那么顺畅
Dijkstra算法,比较复杂,至今还不是很懂
拓扑排序算法简单易懂,加一个入度然后用栈
2.PTA实验作业(4分)
2.1 题目1:7-3 六度空间
2.2 设计思路(伪代码或流程图)

建一个队,level标记层数,tail记录本层最后
一个结点,last判断本层是否遍历完 
while(队不空)
{
    出队头;
    遍历本层,全部入队
    遍历完一层,level++
    更新last 
    if到6层了跳出循环 
 } 

2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
技术分享图片

2.4 PTA提交列表说明。
技术分享图片
最大联通图段错误,这种大数据很难改,因为没办法测试,只能把遍历的条件那里初值或者满足条件改一下,一个个试过去,运气好就试出来了

2.1 题目2:7-6 修建道路
2.2 设计思路(伪代码或流程图)

初始化图结构,将已经修好的路的长度置为0
然后用prim算法就可以了

2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
技术分享图片

2.4 PTA提交列表说明。
技术分享图片
刚开始没什么思路,想得有点复杂,还想着比较最小值什么的,后来一想修好的不是不用修吗,那不就是0,就豁然开朗了

2.1 题目2:7-7 旅游规划
2.2 设计思路(伪代码或流程图)

建图时多一个费用
然后初始化时对角线置为0
其他为极大值
然后用Floyd算法,就是判断时候多一个判断要费用最少的 

2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
技术分享图片

2.4 PTA提交列表说明。
技术分享图片
这题还有一个测试点没有过,最大时运行超时,上课时炳辉同学介绍了用Dijkstra算法做,但是我就觉的Floyd算法代码量更少,就是不知道为什么运行超时
有空了再用Dijkstra算法做一下

3.截图本周题目集的PTA最后排名(3分)
本次题目集总分:310分

3.1 PTA排名(截图带自己名字的排名)
技术分享图片

3.2 我的总分:251

  1. 阅读代码(必做,1分)
    Bellman-Ford:
    求单源最短路,可以判断有无负权回路(若有,则不存在最短路),
    时效性较好,时间复杂度O(VE)。

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <queue>
    using namespace std;
    int dis[10010];
    int book[10010];
    int origin[10010],destination[10010],value[10010];
    int n,m;
    int total;
    int next[10010],head[10010];
    void adl(int a,int b,int c)//邻接表
    {
       total++;
       origin[total]=a;
       destination[total]=b;
       value[total]=c;
       next[total]=head[a];
       head[a]=total;
    }
    void Bellman_ford(int a)
    {
    memset(book,0,sizeof(book));//book[i]表示i号点是否在队列里
    memset(dis,88,sizeof(dis));
    queue <int> q;
    q.push(a);
    book[a]=1;
    dis[a]=0;
    while(!q.empty())//当队列不为空时更新
    {
        for(int e=head[q.front()];e;e=next[e])//枚举队首点相邻的每一个点
        {
            if(dis[destination[e]]>dis[origin[e]]+value[e])
            {
                dis[destination[e]]=dis[origin[e]]+value[e];
                if(book[destination[e]]==0)
                {
                    q.push(destination[e]);//将更新的这一个点入队
                    book[destination[e]]=1;
                }
            }
        }
        q.pop();//弹出队首元素
    }
     } 
    int main()
    {
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        adl(a,b,c);
       } 
    Bellman_ford(1);
    for(int i=1;i<=n;i++)
        cout<<dis[i]<<" "; 
    }

    该算法是利用动态规划的思想。该算法以自底向上的方式计算最短路径。
    它首先计算最多一条边时的最短路径(对于所有顶点)。然后,计算最多两条边时的最短路径。
    dijkstra固然很好用,但是却解决不了负权边,想要解决这个问题,就要用到Bellman-ford.

博客作业06--图

原文:https://www.cnblogs.com/hbw985609191/p/9192307.html

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