DS博客作业06--图

DS博客作业06--图

1.本周学习总结

1.思维导图

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

    本章是对图的学习,本以为图会十分复杂,至少比树是要复杂的,没想到会比树好操作一点,主要是递归少,而且结构常用的就是邻接表和邻接矩阵。虽说比树简单一点,但还是会碰到一些问题,尤其是学习到Prim算法和Dijkstra算法,若不是反复多遍的看课本加上上课认真听课和经过课堂派的预习,真的不好理解。在pta的练习中,也是用了比较久的时间去完成作业,虽然没有遇到太大的坎坷,但耗时相比其他同学相对较高,这也许是代码的缺陷吧,关键路径也不太简单,不过没有代码要求,也算是减轻了一些难度,总之多刷题,bug改多了,准确率便高了。

2.PTA实验作业

2.1.题目1:7-1 图着色问题

2.1.1设计思路(伪代码)

Judge函数传入邻接表G,数组s   //s数组存各个结点的颜色,在main中已经判断颜色种类符合题意
    定义整型i,v
    for v=1 to v=G->n do
        p指向以结点v为头结点的第一个边结点
        while p不为NULL do
            if 结点v的颜色s[v]与p结点的颜色相同 then
                输出No并退出函数
            end if
            p指向下一个结点
        end while
    end for
    输出Yes

2.1.2代码截图

2.1.3本题PTA提交列表说明。

Q1:本题是深度遍历的练习,刚开始也是往深度遍历,写的过程中发现其实直接对邻接表中链表逐一进行遍历就可以

A1:所以我就用此方法很快就写完了

Q2:提交后发现有一个测试点没过

A2:原来颜色数目少于题目要求也是错的,然后就过了

2.2 题目2:7-3 六度空间

2.2.1设计思路(伪代码)

judge函数传入邻接表G
    定义边结点指针p
    定义整型i,count,v,flag,count1
    定义整型数组t[10000]
    定义队列s
    for v=1 to v=G->n do  //遍历结点
        count=0,count1=1    //初始化
        将v结点入队
        t[v]=v   //为了不用对数组进行重置,所以令其为v
        flag=v    //flag存每一层最后一个结点
        while 队列不空 do
            p指向以队列第一个元素为头结点的第一个边结点
            while p不为NULL do
                if t[p->adjvex]!=v then    //即p结点还没有被访问过
                    将p结点的值入队
                    t[p->adjvex]=v    //置为已访问
                    count1++     //记录访问结点总的个数
                end if
                p指向下一个边结点
            end while
            if 队头元素与flag相等 then
                count++     //访问深度
                flag等于队尾
            end if
            if count==6 then break
            队列出队一次
        end while
        输出百分比    //count1除于总结点个数
        队列清空

2.2.2代码截图

2.2.3本题PTA提交列表说明。

Q1:本题在陆大机房就开始尝试,当时图结构还不是很熟悉,打的巨慢,而且不知道如何进行遍历

A1:代码拿回来,之后想到用广度遍历可以比较好的解决这个问题

Q2:写完后,自己感觉也没啥问题,一提交,测试点有一个过不了,而且是运行时错误

A2:只能对代码进行再次修改,把循环从3层换成了两次,经过多次尝试最后通过

2.3 题目3:7-7 旅游规划

2.3.1设计思路(伪代码)

Dijkstra函数传入邻接表G,开始结点Begin,结束结点End
    定义整型v,i,k,MIN1,MIN2
    定义边结点指针p
    定义整型数组dist1[1000],path[1000],dist2[1000]
    定义整型数组visited[1000]
    for i=0 to i=G->n-1 do
        对dist1,dist2,path数组初始化
    end for
    v=Begin,dist1[v]=0,dist2[v]=0
    while 1 do
        MIN1=MIN2=1000000  //初值
        for i=0 to i=G->n-1 do     //找dist1最小结点,若相等则找dist2较小的
            if MIN1>=dist[i]且visted[v]不为1 then
                if MIN1>dist1[i]或MIN2>dist2[i] then
                    MIN1=dist1[i],MIN2=dist2[i],v=i
                end if
            end if
        end for
        if v==End then break   //结束
        visted[v]=1   //表示已经选择过的结点
        p指向以v为头结点的第一个边结点
        while p不为NULL do    //修改dist1和dist2
            if p->length + dist1[v]<=dist1[p->adjvex] then
                if p->length+dist1[v]<dist1[p->adjvex]或p->price+dist2[v]<dist2[p->adjvex] then
                    对dist1,dist2,path 进行修改
                 end if
            end if
            p指向下一个结点
        end while
    endwhile
    输出dist1[v]和dist2[v]

2.3.2代码截图

2.3.3本题PTA提交列表说明。

Q1:这一题主要问题是对Dijkstra算法的使用,这个算法刚接触比较陌生,写本题代码时一时无从下手

A1:看了课本,发现本题的代码用课本里的代码改造一下即可,最后在自己写一遍,经过多次调试过了

3、上机考试错题及处理办法

3.1.1截图错题代码:7-1 六度空间 


3.1.2 错的原因及处理方法

     此题错的非常可惜,把64句删掉就可以过。(陆大216的编译器真心不行。。。)

3.2.1截图错题代码:6-1 jmu-ds-最短路径

      此题上机课没打

3.2.2 错的原因及处理方法

posted @ 2019-06-01 14:31  ywww  阅读(268)  评论(0编辑  收藏  举报