图 作业

1.本周学习总结(0--2分)

1.思维导图

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

本章学习: 图的存储结构  Prim算法和Kruscal算法  拓扑排序
图中的顶点关系比树的更加复杂,不再是单纯的层次关系,而是平等的,点与点都可能连通,所以存储就需要模拟一个平面,在图的关系比较稀疏是用邻接表(使用线性存储),反之使用邻接矩阵,二维数据即可表示出一个平面。图的问题,主要是遍历和路径,难点在于找到相应算法(或者多种算法结合),解决一些实际问题时一般都会对算法进行相应的改动。
图的遍历比较经常用的是深度优先遍历和广度优先遍历。图的深度优先遍历是从初始点v出发,以纵向的方式逐渐访问各个顶点,一旦找不到相邻的顶点就回退,需要递归的过程,广度遍历是类似层次遍历,利用队列来一一访问。
接着就是学Prim算法和Kruscal算法了。Prim和Kruscal算法,Prim算法是多次寻找邻边的权重最小值,而Kruskal是需要先对权重排序后查找的,Kruskal在算法效率上是比Prim快的,因为Kruskal只需一次对权重的排序就能找到最小生成树,而Prim算法需要多次对邻边排序才能找到。两种算法的时间复杂度不同,Prim算法的时间复杂度为O(e^2),Kruskal算法的时间复杂度为O(e^3).
拓扑排序是将一个有向无环图G的所有的顶点排成一个线性序列,使得有向图中的任意的顶点u 和 v 构成的弧,(u, v) 属于该图的边集,并且使得 u 始终是出现在 v 前面。并且只有有向无环图才可以进行拓扑排序。该算法的思想:一:找到有向无环图中没有前驱的节点(或者说是入度为0的节点)输入;二:然后从图中将此节点删除并且删除以该节点为尾的弧。

2.PTA实验作业(6分)

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

2.1.1设计思路(伪代码)

2.1.题目1:图着色问题

begin:
输入顶点数与边数,颜色数进行建图
     输入待检查的颜色分配方案的个数n
    for( ;n;n--){
            for i=1 to 顶点数{
             输入颜色的分配方案,统计所用颜色总数num
              }
         若统计的颜色总数num!=题干的颜色数     
              则把flag由0赋为1
      }
         将颜色按深度遍历排序储存在数组中
          for i=1 to 顶点数{
                for j=1 to 顶点数{
                  若有相邻的颜色相同
                      则把flag的值由0赋为1
               }
             flag值已为1即已有相邻颜色相同停止循环
      }
   如果flag=1 输出no 否则 输出yes

2.1.2代码截图



2.1.3提交说明

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

Q1.第一二次编译错误问题出在void Judge(MGraph g,int n,int sum)函数端口处的for循环中对i的初始化值
Q2.最后稍作修改for循环参数初始化的数值完成编译
A.get到函数端口问题对于程序的影响非常大,稍微的数值改动对程序都是非常关键的,所以算法的选择至关重要

2.2 .1题目2同题目1

begin:
定义n,e
if   e>=n-1
    for   k=0 to e
        输入顶点 权值
        权值存入邻接矩阵
    调用prim函数
else //一定不连通
    输出-1
定义数组lowcost
for   i=1 to n
    lowcost赋初值
for i=0 to n
    min=INF
    for j=1 to n
        if    lowcost[j] 且 lowcost[j]<=min
            min=lowcost[j];
        k=j;
     lowcost[k]=0
    if   min!=INF
        count+1
        cost+=min
    for    j=1 to n
        修正lowcost数组
if         count==n-1
    输出cost
else //不连通
    输出-1

2.2.2代码截图





2.2.3提交说明

说明:
Q1.部分正确的原因是函数调用中对j的初始化取值取值为0,导致部分答案不符合题目要求
Q2.在void CreateMGraph(MGraph &g,int n,int e )函数中输入邻接矩阵时顺序弄错了
A.做泽中题目事先画图比较实在

2.3 .1题目3

begin:
 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.3.2代码截图




2.3.3提交说明

Q1.对于编译错误的情况时因为void CreateAdj()函数的没有定义好参数变量,对i,j所对应要实现的作用没看清楚,导致函数混乱
Q2.主函数中对函数的安排不够严谨
A.六度空间是一道思维量很大的题目,代码虽然少,但是要实现的功能非常多
##3、上机考试错题及处理办法(-2--2分)

##3.1.截图错题代码
错题:6-3 jmu-ds-拓扑排序 (20 分)  7-2 公路村村通 (30 分)
![](https://img2018.cnblogs.com/blog/1477754/201906/1477754-20190609171623497-1554376788.png)

![](https://img2018.cnblogs.com/blog/1477754/201906/1477754-20190609171916617-943313032.png)

##3.2 错的原因及处理方法
错的原因? 我就是不会打啊,考试中只能用cout 的方法拿分虽然这是个测试答案的方法但是不影响我拿分
怎么解决:拓扑排序我参考身上例题打了一遍代码,大概懂了什么意思,而另外一题的话是考试中时间不允许,只能靠方法拿分。。。。
end
文字说明代码中那里错,怎么解决
原文地址:https://www.cnblogs.com/mr3woman/p/10964457.html