DS博客作业06--图

1.本周学习总结

1.1思维导图

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

图是个多对多的结构,可以用邻接矩阵或者邻接表来储存
图的遍历分为深度优先遍历和广度优先遍历,它们分别适合不同的问题,例如着色问题适合用深度优先遍历,六度空间适合广度优先遍历
求图的最小生成树可以用普里姆算法或者克鲁斯卡尔算法
求图的最短路径可以用迪杰斯特拉算法或者费洛伊德算法
这些代码书上都有,我觉得代码应该要理解的记,不要去死记硬背
图的拓扑排序是对有先后顺序的事件的完成顺序的排序,它是个有向无环图

2.PTA实验作业

2.1.题目1:图着色问题

2.1.1设计思路(伪代码)

因为颜色的数目是固定并且可能有重复的的,所以可以使用set容器,去掉相同的数
用vector容器的二维数组将每个顶点连接的顶点储存起来
用book数组存放颜色方案里的每个顶点所对应的颜色,用for循环遍历对比和该顶点相邻的顶点颜色是否一样
定义全局变量,n,e,colornum分别代表顶点,边数,和颜色数量
定义int型的set容器变量s,二维数组型的vector变量vec,定义数组book,为存放颜色方案的数组
输入n,e,colornum
输入两个端点,放进vec数组中
输入N,代表N个方案
while(N--) do
    s.clear();//对每个方案的s里的数据都清除
    初始化book数组为0
    for i=1 to n do
        输入num
        book[i]=num//book数组存放每个颜色
        将num放入set容器s中
    end for
    if(s.size()!=colornum)//即输入的颜色数量与一开始输入的所给的颜色数量不一样
        输出No,继续判断下一个颜色方案
    for i=1 to n do
        for j=0 to vec[i].size()-1 
            如果book[i]与book[vec[i][j]]相等//即相邻的端点颜色一样
                输出No,继续判断下一个颜色方案
    end for
    输出Yes//即没有上面的情况
end while
    

2.1.2代码截图


2.1.3本题PTA提交列表说明

Q1:这题疯狂试探,总是部分正确,一开始是最小图错误,不是很理解最小图是指什么
A1:然后将数组的下标改了从0开始,就出现了其它的错误
A2:后来又去回顾代码,发现我的judge函数里没有写返回true,只有返回false,这么一个小错误,让我疯狂试探了那么多次,自闭了

2.2 题目2:公路村村通

2.2.1设计思路(伪代码)

这题相当于求最小生成树
用的是克鲁斯卡尔算法,并且采用了并查集直接进行通量的合并,以及库函数sort根据道路的价格cost进行排序
判断是否能通路,可以根据最小树的特点,边数为端点数-1
定义count=0,输入城镇数量citynum,以及道路数量roads
初始化辅助数组f
输入两个端点x,y和所需的费用cost
用sort对结构体进行排序
for i=0 to roads
    如果x,y不是同一个集合
        把最小边加到总花费sum里面
        count++
end for
如果 count==citynum-1
    输出sum
否则输出-1

2.2.2代码截图



2.2.3本题PTA提交列表说明

Q1:这题上机考的题集里也有出现,就是求最小生成树,考试时并没有写出来,老师提示用最短路径的代码然后加上prim算法就可以了
A1:但是我连prim算法都不会敲(那会还不会),于是就没写了
A2:后来看书写代码,用的是克鲁斯卡尔算法基本上是看书的,然后并查集不是很懂就上百度了

2.3 题目3:旅游规划

2.3.1设计思路(伪代码)

定义road结构体,里面有distance和cost两个成员
宏定义INF为32767
定义Road的结构体Mat[505][505]
定义citynum,roads,startcity,endcity并且输入
初始化矩阵所有元素为INF
while roads--:
    给Mat矩阵赋值
弗洛伊德算法
for k=0 to citynum-1:
    for i=0 to citynum-1:
        for j=0 to citynum-1:
            if 原路径比新路径长
                更新Mat[i][j]的cost和distance
            else if 原路径等于新路径:
                if 原路径消费 > 新路径:
                    更新Mat[i][j]的cost和distance
            else 保持不变
输出Mat[startcity][endcity].distance和Mat[startcity][endcity].cost;

2.3.2代码截图


2.3.3本题PTA提交列表说明

A1:这题相当于求最短路径,我用的是费洛伊德算法,三层循环简单粗暴,先判断距离哪个比较近再判断价格

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

3.1.1截图错题代码

六度空间

3.1.2 错的原因及处理方法

上机考时也没写几道题,除了函数题,就提交了这个编程题,这是那题六度空间的题目
老师上课有讲过这题用广搜就可以做了,但是显然我还是不是很懂,所以去看了大佬的博客
这题的思路和着色问题有点像,也是用vector容器,存了每个顶点所连接的点,然后用队列也就是广搜,将没访问到的进行访问并放进set容器里,进行六次的循环,最后对set取长度就可以得出与该结点距离不超过6的结点数了
当时考试前疯狂记代码,然后一下子记了好几个,到考试时就都记混了,自闭了,最后也没能把这题代码正确打出来,归根结底还是对代码的理解不透彻,只想着背背代码混个考试,不能够啊
考试结束后看了正确的代码,我离它的差距就是最外层的那个六次的循环,我写成了while(q.size()),就只对了一个测试点,鬼知道我在想这些什么

3.2.1截图错题代码

拓扑排序

3.2.2错的原因及处理方法

拓扑排序思路挺简单的,计算每个结点的入度,将入度为0的结点放进数组中,然后将度为0的结点标记,并将所连的结点的入度减一
我感觉我的代码没得毛病,但是在dev运行,运行不太起来,提交后发现是段错误,这谁顶得住啊,还没找到vs
到最后还是没看出哪里有毛病,结束后,对比了一下正确的代码,发现就一个下标的错误,将index改成top就对了,我还一直往是不是越界了的方向想,压根没在意这个地方
果然细节才是魔鬼
posted @ 2019-06-02 21:12  Hyjjing  阅读(190)  评论(0编辑  收藏  举报