DS博客作业06--图

1.本周学习总结 1476101-20190309202403056-34355844.jpg

1.1 思维导图

1476101-20190602203153870-1160362061.png

1.2 学习体会 ?

本章学习了图结构的相关知识,图形结构属于复杂的非线性数据结构,在实际应用中很多问题可以用图来描述。对于图结构的认识,图中元素之间的关系是多对多的;图结构的存储分为临邻接矩阵和邻接表;图的遍历分为深度遍历和广度遍历,深度遍历求出的路径不一定时最短路径,而广度遍历求出的路径一定是最短路径。

关于图的学习,可能是因为临近期末,这几周的学习比较赶,学到的知识也掌握的不是很熟练,比如最小生成树的Prim算法、Kruscal算法,最短路径Dijkstra算法、Floyd算法这几种算法掌握的不是很好,总是忘得很快,容易混淆。

2.PTA实验作业 1476101-20190309202340995-2116737649.jpg

2.1 图着色问题

1476101-20190603162224522-868988446.png

2.1.1 设计思路

int main() //主函数
输入顶点数与边数,颜色数进行建图
     输入待检查的颜色分配方案的个数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 代码截图

1476101-20190603165852777-1775979228.png
1476101-20190603165930241-190466572.png
1476101-20190603170008085-207362733.png

2.1.3 PTA提交列表说明。

1476101-20190607164946935-642794322.png

  • 计算颜色种类时,变量忘记初始化为0
  • 数组上限定义不够

2.2 六度空间

1476101-20190603162258641-2127067455.png

2.2.1 设计思路

int main() 
    输入N,M;
    构建邻接矩阵; 
    for i = 1 to N
        调用BFS(i);
        初始化visit数组;
        计算百分比,并输出;
int BFS(int v) 
    定义队列q;
    定义 temp, count = 1;
    定义level= 0; //记录层数
    定义last = V;//记录当前层数的最后一个元素 
    定义tail;//指向下一层最后一个元素
    把v入队;
    visit[v] = 1;
    while (!q.empty()) 
        取队头元素;
        出队;
        for i = 1 to N
            if arr[temp][i] && visit[i] == 0 then 
                count++;
                tail = i;
                visit[i] = 1;
                i进队;
            end if 
        if temp == last then 
            level++;
            修改last的值为tail;
        end if
        if level == 6 then
            break;
    返回 count;

2.2.2 代码截图

1476101-20190603165446486-453444184.png
1476101-20190603165511731-1246710436.png

2.2.3 PTA提交列表说明。

1476101-20190607172907316-762000112.png

  • 自己做的时候,总有问题,一直过不了,后来参考同学的代码
  • 这个代码比较简洁,运用了队列,也使用了memset函数,使初始化更加简洁

2.3 公路村村通

1476101-20190603162327528-132103899.png

2.3.1 设计思路

int main()
    定义 最低成本cost = 0;
    输入v,e;
    建图;
    cost =Prim(v,e);
    输出cost;
void CreateGraph(int v,int e)//用邻接矩阵表示图
    初始化;
    读入权值;
    无向图对称;
int Prim(int v,int e)
    定义min,i,j,k;
    定义 lowcost[MAXVEX];
    定义 cost =0;
    lowcost[1] = 0; //初始化第一个权值为0,即v0加入生成树
    for i=2 to v
        lowcost[i] = G[1][i];//对顶点1所相邻的边进行初始化
    for i=2 to v
        令min等于无穷;
        j = 1;
        k = 0;
        while( j<=v )
            将lowcost[]数组最小的边赋值给min;
            用k记录该边所对应的顶点;
            j++;
        if k==0 then //不连通
            return -1;
        end if;
        cost += min;
        lowcost[k] = 0; //将当前顶点设置为0,表示此结点已经完成任务
        for j=2 to v
            if lowcost[j]!=0 && G[k][j]<lowcost[j] then
            //若下标为k顶点各边权值小于此前这些顶点未被加入生成树的权值
                lowcost[j] = G[k][j];
            end if;
    返回 cost;

2.3.2 代码截图

1476101-20190603162748029-551299736.png
1476101-20190603162933818-750039000.png
1476101-20190603162841005-1133946853.png

2.3.3 PTA提交列表说明。

1476101-20190607175620455-1535022242.png

  • 刚开始对图初始化时,令 G[i][j]=NULL ,而且 没有令min等于无穷,后来请教同学将min设为不存在边的g数组的值,以此来判断各个顶点与其他顶点是否存在边

3.上机考试错题及处理办法 1476101-20190309202432995-718470712.jpg

3.1 截图错题代码

1476101-20190607180559008-1381287880.png
1476101-20190607180634312-1747324566.png

3.2 错的原因及处理方法

  • 刚开始也不知道哪里错了,编译出来的答案是错的,后来看了半天发现,其中一个for循环里面i没有赋初值,导致计数并不是从1开始,导致答案错误

  • 错误:
    1476101-20190607181030981-693867374.png1476101-20190607181053660-1229860696.png

转载于:https://www.cnblogs.com/qq1191834402/p/10963137.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值