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

    1.本周学习总结

    1.1 思维导图

    1.2 谈谈你对图结构的认识及学习体会。

    在图这一章中,我学到的内容有:
    1.在对应关系上,图不同于线性表和树。线性表中的元素是“一对一”的关系,树中的元素是“一对多”的关系,而图中的元素是“多对多”的关系。
    2.图是一种复杂的非线性结构,在图结构中,每个元素都可以有零个或多个前驱,也可以有零个或多个后继,也就是说,元素之间的关系是任意的。
    3.图的存储结构有邻接表、邻接矩阵等结构。图的遍历也可分为深度优先遍历和广度优先遍历。
    疑惑的地方:
    .对于求从一个顶点到其余各顶点的最短路径的算法不理解。
    

    2.PTA实验作业(6分)

    要求挑3道题目写设计思路、调试过程。设计思路用伪代码描述。题目选做要求:

    题目必须是编程题,不要函数题!!!!!

    2.1.题目1:六度空间

    2.1.1设计思路(伪代码)

    利用广度遍历逐层遍历图
    .定义N是结点,M是边以及定义顶点访问标记数组visited[]和关联数组Adj[][]
    主函数main()
    .输入N和M
    .输入数据,将有关联的两点数组Adj置为1 
        for i=1 to N do 
            初始化visited数组 
            计算并输出百分比 
    .end for 
    
    int BFS(int v) 
    .新建队列q 
    .v出队q 
     .visited[v]置为1
        while   (队不空且层数小于6) 
            取队首做临时调用点w 
            循环遍历结点
                如果结点未遍历
                则结点人数加一,记录位置,记录visited,入队 
            if w==last then 
                记录当前层数的最后一个元素的位置 
                结点层数加一
            end if 
        end while
    

    2.1.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)



    2.1.3本题PTA提交列表说明。

    PTA提交列表中的每个错误详细说明为什么及如何解决。

    Q1:一开始把percentage定义成int类型的数据,然后percentage的计算式写成percentage=100*BFS(i)/N;
    A1: 把原来的数据类型改成double类型数据,再把percentage的计算式改成double percentage=100.00*BFS(i)/N;
    
    Q2:对广度遍历函数代码的理解不透,for循环中的循环条件少了一个“=”
    A2:  将i<N改成i<=N
    

    2.2.题目2:7-1 图着色问题

    2.2.1设计思路(伪代码)

    int main()
    . MGraph g;
    .定义color[502],flag=0,num=0;
    . 定义 v,e,k,n,i,j;
    . 输入 v,e,k;
    . Create(g,v,e);//创建邻接矩阵
        输入方案个数n;
    .while   n--
        
            int visited[502]={0};
            num=0;flag=0;
            for i=1 to i<=g.n
            {
                输入color[i];
                if(visited[color[i]]==0)
                {
                    visited[color[i]]=1;
                    num++;
                }
                end if
    .end for
            if(num!=k)
            flag=1;
    . for i=1 to i<=g.n
      .for j=1 to j<g.n
            {
                if(g.edges[i][j]==1&&color[i]==color[j])
                {
                    flag=1;
                    break;
                }
                if(flag==1)
                break;
            }
            end for
    .if(flag)    
            cout<<"No"<<endl;
    .else
        cout<<"Yes"<<endl;
    .返回 0;
    
    void Create(MGraph &g,int v,int e)//建立邻接矩阵
    .定义整型数据i,j,k, a,b;
    .定义vexs[500];
        for i=1 to i<=v
        vexs[i]=1;
        for j=0 to j<e
        {
            输入 a,b;
            g.edges[a][b]=1;
            g.edges[b][a]=1;
        }
    . end for
        g.e=e,g.n=v;    
    

    2.2.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)



    2.2.3本题PTA提交列表说明。

    Q1:最大图的测试点过不去,范围不够大导致答案错误
    A1:将color[500]改为color[502]
    

    2.3.题目3:公路村村通

    2.3.1设计思路(伪代码)

    prim函数
    循环将节点1的相邻边之间的权重存入数组lowcost,作为最小权重
    for循环找出n-1个节点的最小权重
        for循环遍历各个节点
            if(权重不为0且不为无穷)
                min记住此时权重,k记住该节点 j
        if(min为无穷)
            非连通图,返回-1
        num加上此时min,为修路最小花费
        for(遍历节点调整边关系)
            if(权重不为0且两点间权重小于lowcost存的)
                调整lowcost为该权重,同时 j 的closest值改为k
        end for
    end for
    输出最小花费num
    

    2.3.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)



    2.3.3本题PTA提交列表说明。

    PTA提交列表中的每个错误详细说明为什么及如何解决。

    Q1:使用了c++语法,没有更换编译器
    Q2:数组的容开小了,容易越界;
    

    3.上机考试错题及处理办法(-2--2分)

    题目:6-2 jmu-ds-邻接矩阵实现图的操作集 
    

    3.1.截图错题代码



    3.2 错的原因及处理方法

    这题是对图的基本操作(深度优先遍历、广度优先遍历、建图)的考察。这道题在考试的时候我还是没能写出来,它提示我答案错误。
    在写深度遍历和广度遍历的函数时,两个for循环里的if条件语句我漏写了一个g.edges[v][i]=1,然后检查发现了这个错误并改过来之后发现还是存在
    错误,考试结束后,跟别的同学的代码做对比发现,建图和深度遍历的函数都完全正确。问题在于广度遍历中,循环时的循环条件写错了,写成了
    i<g.n,把它改成i<=g.n之后就可以得到答案正确了;
    
  • 相关阅读:
    百度之星2019 初赛一 题解
    [NOI2019]弹跳(KD-Tree/四分树/线段树套平衡树 优化建图+Dijkstra)
    [BZOJ2157]旅游(树链剖分/LCT)
    [BZOJ3230]相似子串(后缀数组)
    回文树/回文自动机(PAM)学习笔记
    [CF30E]Tricky and Clever Password(KMP+manacher)
    APIO2019题解
    代码大全
    算法竞赛常用资料整理
    手动修复 Flash CS3 简中化不完全问题
  • 原文地址:https://www.cnblogs.com/112Ada/p/10964109.html
Copyright © 2011-2022 走看看