DS博客作业06--图

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

1.思维导图

DS博客作业06--图_第1张图片

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

1.图相对于树,结构更加复杂。图包括边权重,节点的关键字,节点与节点之间的对应关系。图一般由邻接表和邻接矩阵存储,邻接表和邻接矩阵的结构体定义不同,相对来说,邻接矩阵一般用二维数组存储数据,操作相对于邻接表来说更简单。邻接表采用头结点加链表的形式存储数据,在构建邻接表的时候一遍要借助二维数组辅助建图。

2.PTA实验作业(6分)

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

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

2.1.题目1:题目名称:7-1 图着色问题 (25 分)

2.1.1设计思路

定义结构体
int main()
{
    AdjGraph* G;
    输入节点数,边数,颜色数
    建图
    输入配色方案
    for (i = 0; i < v; i++)
    {
        判断每个方案是否符合条件
    }
    return 0;
}
int Color(AdjGraph * G,int v)
{
    int a[600];
    int i,sum=0,star,end;//sum用于标记颜色数目,star和end用于比较颜色是否重复
    for(i=0;i<600;i++)
    {
        a[ ]初始化
    }
    for (i = 1; i <= G->n; i++)
    {
        输入数据并标记
    }
    for (i = 0; i < 600; i++)
    {
        计算颜色数
    }
    if (sum != v)//颜色不匹配退出
        return 0;
    ArcNode* p;
    for (i = 1; i <= G->n; i++)
    {
        p = G->adjlist[i].firstarc;
        star = G->adjlist[i].data;
        while (p != NULL)
        {
            end = p->adjvex;
            end = G->adjlist[end].data;
            if (end == star)//颜色重复结束程序
                return 0;
            p = p->nextarc;
        }
    }
    return 1;
}
void CreateAdj(AdjGraph * &G, int n, int e)//创建图邻接表
{
    int i, j, k;
    ArcNode* p;
    G = new AdjGraph;
    for (i = 0; i <= n; i++)
        邻接表初始化
    static int g[MAXV][MAXV];
    for (k = 0; k < e; k++)
    {
        建邻接矩阵
    }
    for (i = 1; i < n + 1; i++)
    {
        for (j = 1; j < n + 1; j++)
        {
            if (g[i][j] == 1)
            {
                转换为邻接表
            }
        }
    }
    G->e = e;
    G->n = n;
}

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

DS博客作业06--图_第2张图片

DS博客作业06--图_第3张图片

DS博客作业06--图_第4张图片

2.1.3本题PTA提交列表说明。

DS博客作业06--图_第5张图片

Q1:出现多种错误,答案只有部分正确。
A1:   重新建图,重新设计算法,却无法突破最大图,经过计算,发觉在初始条件要设置MAXV增加MAXV的大小来解决最大图的问题。

2.2.题目2 题目名称:7-3 六度空间 (30 分)

设计思路

建结构体
int main()
{
    AdjGraph *G; 
    输入边n节点e
    CreateAdj(G,n,e);//建图
    for(i=1;i<=G->n;i++)
    {
               根据广度遍历输出结果
     }
    return 0;
}
void CreateAdj(AdjGraph *&G,int n,int e)//创建图邻接表
{
    建图
}

void BFS(AdjGraph *G,int i,int&count) //v节点开始广度遍历  
{
    广度遍历一层一层的进行统计一个节点六度空间范围内的节点数
    
}

2.2代码截图

DS博客作业06--图_第6张图片
DS博客作业06--图_第7张图片
DS博客作业06--图_第8张图片

2.2提交列表

DS博客作业06--图_第9张图片

Q1:出现多种错误,段错误,运行超时。
A2:原因算法设计不科学,在设计MAXV时考虑不充分,需要增大MAXV的数值
Q2:经过测试还是有很多错误。
A2:经过检查,发现对层次的判定设置的条件不符合规范,要设置一个last存放最后的数,用tail比较出队列的数,判断队列的层次。

2.3 题目3 :7-4 公路村村通 (30 分)

设计思路

公路村村通可以采用Prim算法或者Kruskal算法解决问题,本题我采用Prim算法设计,同时加以改造,课本上的Prim算法有漏洞,最后会出现环路,我采用visited数组辅助判断,防止出现重复边

代码截图

DS博客作业06--图_第10张图片
DS博客作业06--图_第11张图片
DS博客作业06--图_第12张图片

提交列表

DS博客作业06--图_第13张图片

Q1:算法设计太复杂,时间复杂度太高达到O(n3)
A1:一开始没有理解题目,自己设置算法,算法思路是先找出最小边,之后不断找最小边,只要这个边连接的节点没有被遍历过,就可以加上它的权重进行统计,反之就不统计
后来发觉自己没有理解算法,采用Prim算法进行解题
Q2:后来采用Prim算法,结果发现课本中的算法有漏洞。
A2:课本中的算法会出现环路,后来我采用visited数组进行辅助判断得出结果。

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

3.1.截图错题代码

上机考试时代码量不够,公路村村通和六度空间的代码都没打,考试的时候直接放弃

3.2 错的原因及处理方法

错误原因:没有打代码
没有打代码的原因:没有跟上老师的步伐,老师开始讲图的时候我还在学树,老师讲完图的时候我才刚开始,最后还在忙于学习图。
处理办法:不知道,打一题代码经常要5个小时,不断地调试不断地纠错,一天能打完两道题就已经很多了。跟不上老师的步伐,学习效率低,理解力差。
上机考试的代码我后面有打,六度空间和公路村村通两道题花了我十个小时的时间,总体来说效率虽然很低,但是不愿放弃。

你可能感兴趣的:(DS博客作业06--图)