DS博客作业06--图

目录

1.本周学习总结

1.1思维导图

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

本章学习了图结构的的相关知识,相对于树各有各的难点,树更多的递归,图更类似于一个二维结构,图属于复杂的非线性数据结构,在实际应用中有很多问题可以用图来描述,比如网络,在图形结构中,每个元素可以有零个或者多个前驱元素,也可以有零个或者多个后继元素,元素之间的关系是多对多的,相对于之前的学习,图的基本术语更加复杂。常用的图的存储结构有邻接矩阵和邻接表,邻接矩阵就是用二维数组来表示,而邻接表则是定义三个结构体组成的图结构。邻接矩阵更使用于稠密图,邻接表更适用于稀疏图。

2. PTA实验作业

2.1 六度空间

2.1.1 设计思路

算法思路

  • 对于每个结点进行广度优先搜索
  • 搜索过程中累计访问的结点数
  • 需要记录层数,仅计算6层以内的结点数

伪代码

    int BFS(vertex V)
    {
        visited[V]=true;
        count=1;
        level=0;
        last=v;
        while(队列不为空)
        {
        	    x=出队列;
    	        for(x的每个邻接点w)
	        {
		        if没有被访问
		        {
			        visited[w]=true;
			        w进队列;
			        count++;
			        tail=w;
		        }
	        if(访问到该层最后一个元素)
	        {
		        level++;
		        last=tail;
	        }
	        if(层数level=6)break;
        }
        返回count
    }

2.1.2 代码截图

2.1.3 本题PTA提交说明

2.2 修改道路

2.2.1 设计思路

算法思路

其实就是公路村村通的进一步复杂题,这里给的是二维数组输入所以输入方式要用双重for循环,然后将值作为公路的花费,运用最小生成树这里把访问过的设置为-1,已经建好的路且未被访问花费设置为0即可

伪代码

    将各个公路长度输入g[max][max];
    输入公路(x,y)并将其置为0;
    定义cost数组;
    for(遍历所有城市)
    {
        更改所有城市到起始城市1的花费;
    }
    起始城市1的花费cost[1]=-1;
    定义sum记录总花费置为0;
    for(遍历n-1次,把剩下的城市都加入)
    {
        每次循环min重置32768,K=-1;
        for(遍历所有城市)
        {
            用if语句在没有访问过的城市找出最小花费;
            同时k记录最小花费的城市;
        }
        if(存在最小花费的城市)
        {
            sum+=找到的最小花费;
            cost[k]=-1以访问过;
            for(访问所有城市)
            {
                修改cost数组;
             }
    }
    输出sum;

2.2.2 代码截图

2.1.3 本题PTA提交说明


  • 前一张是公路村村通的提交列表,因为是在公路村村通的代码上修改所以很容易就通过了,公路村村通题中总是有一个最大NM,过不了,也没办法测试,思路貌似也是对的,最后重写过了,到最后也不清楚哪里没写好。。。
  • 编译错误因为vs貌似过大的二维数组会溢出,把栈容量修改即可,或者放到全局变量具体为什么也不是很清楚。。。

2.3 图着色

2.3.1 设计思路

算法分析

定义三个数组edges来记录边,color记录各个顶点的颜色,利用vis判断颜色数量,因为每行顺次给出V个顶点的颜色(第i个数字表示第i个顶点的颜色)所以可以只用判断每次输入的时候标号比他小的所有的直接联通的点两点间的颜色。

伪代码

    for循环初始化图
    输入n;
    for(i=0到i<n)
    {
        初始化flag,num为0;
        初始化vis数组为0;
        for(遍历所有顶点)
        {
            输入color[j];
            if(该颜色没有出现过)
            {
                vis该颜色置为1;
                num++;
            ]
            if(flag为0同时颜色数量没有超出限制)
            {
                for(遍历标号比他小的所有的直接联通的点)
                {
                    if(出现相同颜色)flag=1;
                }
            }
            if(出现相同颜色或者颜色过多)输出No;
            else输出Yes;
    }

2.3.2 代码截图

2.3.3 本题PTA提交说明


  • 这里flag出错,不能加上当时是想着,只要出现邻接同颜色就退出循环,但是后面还要输入就会出现问题
  • 编译错误因为memset在vs中不用加入头文件string.h,memset(void *s,int ch,size_t n);用于初始化

3.上机考试错题

错题一:

错题二:

错题原因

错了这两题原因一个是时间确实不够,只能把特殊情况输出,再者就是熟练度不够其他题目浪费了很多时间,因为devc指针指不出来也是很难受。
原文地址:https://www.cnblogs.com/zwtcyt/p/10964798.html