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指针指不出来也是很难受。
相关文章
相关标签/搜索