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

1.1思维导图

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

图这一章的学习,是经过树学习后,难得一章重新寻找到感觉的学习。因为这一章比较少用递归,使用的是结构体,很多东西我有基础。所以学起来快很多,而且感觉也很熟悉,有一种似曾相识的感觉。图的结构主要靠2个变量,边和顶点数。这2个变量串起来组成的2中方法:邻接表和邻接矩阵。结构上还是学过的链表和2维数组,所以学起来还是比较顺利。两种不同的存储有各自的优缺点,适用不同的题目。虽然在变成题目代码的实现上还是有难度,但是还是思路想得到。比如pta的好几道编程题,我直接参考数组的写法,跳过了图的写法。如果用图,会复杂点,但是就是增加一步建图的过程,其余的思路都是一样。结构体的定义上不管邻接矩阵还是邻接表都是比较容易。这一章的学习,总体上感觉不错,以前很长一段时间都被树搞的很迷,终于找到点感觉。当然了这一章也是有难度的,难在一些有名的算法的实现。比如基本的一些寻找路径的算法,Dijkstra和Floyd算法,虽然Floyd算法更精短,一些深度,广度遍历的算法,这些算法背下来,能用就行。思路都了解,大体上不会很难,都会使用。

2.PTA实验作业(6分)

2.1.题目1:题目名称

2.1.1设计思路(伪代码)

宏定义无穷大INF为32767
宏定义 MAXV 为1001
宏定义邻接矩阵 g[MAXV][MAXV]/数组 visited[MAXV]={0};
定义 count 为1来判断是否为连通图
Main:
{
定义 i,n,e分别表示循环变量、顶点数、边数 /定义浮点型数据 sum为修路成本
输入 n,e 顶点数 边数
if n-1大于e then //不能够建成图
cout<<-1
return 0
CreateGraph(n, e)//建邻接矩阵
sum=Prim(n,1)//调用prim函数返回sum
if count==n then //说明图连通
cout<<sum
else
输出-1
end if
return 0
} void CreateGraph//建邻接矩阵
{
定义 i,j循环变量
定义 a, b, c;分别对应两个城镇的编号以及该道路改建的预算成本
for i = 0 to n //初始化邻接矩阵
for j = 0 to n do
g[i][j]==0
end for
end for
for i = 1 to e do//赋值矩阵
输入 a,b,c
g[a][b] =g[b][a]= c;
end for
} int Prim//计算最小值
{
定义i, j表示循环变量
定义min为最低的费用,index用来存小路径下标
定义 数组 lowcost[MAXV],close[MAXV],
定义 cost = 0表示最低成本, for i = 1 to n //给2个数组置初值
lowcost[i] = g[v][i];
close[i] = v;
end for
for i = 1 to n
min = INF
定义 flag=0//用来判断这个费用是否符合最低费用要求,如果符合计算进去
for j = 1 to n //从剩下的城市中找最近的点
if lowcost[j] 不等于 0且lowcost[j] 小于 min) then //寻找最少费用
min = lowcost[j];
index = j;
flag=1;
end if
end for
if flag不为0 then //该费用符合题意
cost += min;//加入cost
count++;
lowcost[index] = 0;//记录这个结点访问过
for j=1to n do //调整最短路径,最少费用
if lowcost[j] 不等于 0且g[index][j]小于lowcost[j then//修改最少费用
lowcost[j] = g[index][j];
close[j] = index
end for
end for
return cost//返回费用
}

2.1.2代码截图





2.1.3本题PTA提交列表说明。



+Q1: 第一个提交是没有考虑到边和顶点数不符合关系,这个时候不能够建成功矩阵。

+A1:在主函数判断的时候增加:

+Q2:没有判断连通不连通,万一图是不连通的情况下,也不符合题目要求。

+A2:百度了一个方法,初始化一个

count:



变量用来记录成功的顶点数。如果遍历完成后成功的顶点数和初始n相同,说明每一个顶点都遍历到了,这是一个连通图。否则不符合。

+Q3:25分后最大N这里过不去,不知道怎么解决了。

2.2 题目2

2.2.1设计思路(伪代码)

定义vector和set容器
定义v,e,k,分别是无向图的顶点数、边数、以及颜色数。
定义num是组别的个数
定义动态数组mp;
输入各顶点之间的关系,类似于建邻接矩阵
for i=0 to e
依次输入e个组数据
打入动态数组mp中//输入成有向图这种情况
end for
输入num组判断颜色的个数 do while flag初始化为1
每次循环都将容器 s 清空 for int i = 1 to v
输入各点对应涂的颜色,并且将颜色输入容器 s 中//相同颜色只需要记录一次
end for if 容器 s 大小不等于颜色总数k then flag=0该方案不行 for int i = 1 to v//遍历每个节点
for int j = 0 to mp[i].size()// 遍历与该节点相邻的节点
if 两相邻节点颜色相同 then 不符合涂色方案,跳出循环
end for
if flag=0 then 跳出循环//不合法
end for
if(flag=1) then 输出符合方案
else 输出不符合 end while

2.2.2代码截图

2.2.3本题PTA提交列表说明。



+Q1:第一次容器内的数循环没有清空,导致只能过一个测试点。

+A1:在循环开始前加入:

+Q2:一开始不知道如何判断颜色是否合理,不知道怎么判断。

+A2:百度一下,百度是把用过顶点的颜色信息存在数组里面,类似哈希数组的方法,这一遍历这个数组就知道这个颜色使用过没,是否符合题意。

2.3 题目3

2.3.1设计思路(伪代码)

定义邻接矩阵g[10001][10001],
定义顶点数v,边数e,循环变量i,
定义变量x,y用来存放结点关系数据
main:
{
定义浮点型数据 n,m来求最后所占比率
输入顶点数v和边数e
while e-- //构建邻接矩阵
输入边关系 x y
g[x][y] = g[y][x] = 1
end while for i=1 to v
定义浮点型数据 n,m//记录比率
n=v
m=bfs(i) //调用bfs函数
end for
return 0
} bfs(int z)//广度遍历
{
定义数组vis[10001]=0 记录被访问过的结点
last = z表示记录每层的最后一个元素
tail表示用于记录每一层压入栈时的结点
定义 level = 0 用于判断距离是否合题意为6
定义count=1//记录符合的结点数目
建int型栈q
z入栈
将vis[z]置为1//访问成功标记
while q不为空
z = q.front()//取栈顶元素z
q.pop()//使用过的元素去掉
for i = 1to v //广度遍历
if g[z][i] 等于1 && vis[i]等于 0 then//符合题意
count++;
vis[i] = 1;
q.push(i);
tail = i;
end if
end for if last 等于z then////这一层全部弹出,准备开始下一层,当前层最后一个元素(last) 记录下来 level++;
last = tail;//记录最后一个元素
end if if level 等于 6 break //符合题意距离6,跳出循环 end while return count//返回符合的结点数 }

2.3.2代码截图



2.3.3本题PTA提交列表说明。

+Q1:记录2个比例的时候未使用浮点数,导致结果有误差,没有按题目输出要求输出。

+A1:改成double定义数后输出结果格式正确了。

+Q2:一开始不知道怎么处理距离为6这个问题,使用了深度遍历,查到了到就结束程序,不能够多重方向寻找

+A2:改成广度遍历,加上vis数组判断,这样所有结点都能够访问一遍,所有点都不会漏掉。

+Q3:重新寻找一层的时候没有记住上一层最后一个结点,倒是寻找重复了,

+A3:用last更新上一层的最后一个结点,保证寻找的时候不会重新走老路,记录的都是新的结点。

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

3.1截图错题代码

3.1.1:题目

3.1.2:代码





3.1.3 错的原因及处理方法



+原因:这个格式错误我一开始没想到是输出的问题,因为我只试了bfs函数,发现没问题,结果试了dfs函数发现少了空格,才知道是flag的问题,这里的flag是个全局变量,忘记更改他的值了,结果成这样:

+更改方法:在flag输出了第一个非空后把flag变为1,这样后面的空格就可以出来了。

3.2.1题目

3.2.2代码



3.2.3错的原因及处理办法

+原因:遍历循环查找结点的时候指针忘记移动:少了p=p->nextarc,这一步:

+处理方法:

+原因:输出的时候掉了第一个数据:

+处理方法:

输出的时候这里有问题:



这里flag判断一下直接把第一个数跳过了,flag的作用用来判断输出空的,不能够把数字一起输出,改成这样,把他们拆开:

DS作业06-图的更多相关文章

  1. DS博客作业06—图

    1.本周学习总结 1.1思维导图 1.2学习体会 2.PTA实验作业 2.1 图着色问题 图着色问题是一个著名的NP完全问题.给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色, ...

  2. DS博客作业06——图

    1.本周学习总结(0--2分) 1.思维导图 2.谈谈你对图结构的认识及学习体会. 这章学习了图,学习了图的两种存储结构:邻接矩阵和邻接表.这两种存储结构都用到了之前学c时学到的结构体,将结构体充分运 ...

  3. C语言博客作业06——结构体&文件

    C语言博客作业06--结构体&文件 1.本章学习总结 1.1思维导图 1.2.本章学习体会 在本周的学习中,我们学习了关于结构体和文件的内容.结构体的本身并不难,但以结构体为基础的链表还是让我 ...

  4. 远程调用与编译DS作业

    1.编译服务器上的ds作业 dscc /d 服务器地址:端口 /u 用户名 /p 密码 工程名称 /J 作业名称 解释: 作业名称:直接写作业名称即可,不用.pjb 2.执行服务器上的ds作业 dsj ...

  5. Datastage8.5导入导出DS作业例子

    以下为Datastage8.5的命令行方式的导入和导出,直接登陆服务器执行如下命令即可.不是Datastage客户端的导入和导出,使用命令行方式的好处是:可以将该命令使用shell脚本进行调用导入和导 ...

  6. C语言l博客作业06

    C语言l博客作业06 问题 回答 这个作业属于哪个课程 C语言程序设计ll 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homew ...

  7. 最课程阶段大作业06:U度节能平台控制系统

    除了互联网项目,当今社会还有一个概念非常流行,那就是:物联网.什么是物联网?物联网是通过传感设备,按约定的协议,把任意物品与互联网相连接,进行信息交换和通信,以实现智能化识别.定位.跟踪.监控和管理的 ...

  8. DS作业01--日期抽象数据类型设计与实现

    第六次作业 1.思维导图及学习体会 1.1 思维导图 1.2 学习体会 因为假期里面代码的练习量很小,所以开学来上学期的知识遗忘了很多,刚刚开始写大作业的时候很困难,完全没有思路,后来看了几位同学的代 ...

  9. C博客作业06—结构体&指针

    1.本章学习总结 1.1思维导图 1.2本章学习体会 明白了结构体的定义及使用方法 学会了fopen,fclose,feof等文件操作函数,学会使用c语言进行文件操作 大作业中的部分函数出现未知错误且 ...

随机推荐

  1. python之删除指定目录指定日期下的日志文件

    #=======================================================================================20190521以下脚本 ...

  2. 【UML】活动图Activity diagram(转)

    前言 在UML状态图的总结中说道,活动图和状态图是紧密相关的.它与流程图也有很多相似的地方. 定义 活动图是状态图的一种特殊形式.其中所有或多数状态都是活动状态,而且所有或多数转移都在源状态中的活动完 ...

  3. 为管理复杂组件状态困扰?试试 vue 简单状态管理 Store 模式【转】

    https://juejin.im/post/5cd50849f265da03a54c3877 在 vue 中,通信有几种形式: 父子组件 emit/on vuex 中共享 state 跨组件 Eve ...

  4. OO作业第一单元总结

    一.第一单元作业回顾 ​ 系列一作业分为三周进行,都是表达式求导,难度渐进. ​ 第一次实现的是简单幂函数的求导,第二次加入了sin和cos两种三角函数,第三次实现了三角函数内的嵌套以及引入了表达式因 ...

  5. JS实用技术

    JS外部引用其他文件(建议) <script src="myScript1.js"></script> JS输出显示方式 使用 window.alert() ...

  6. linux命令行调试邮件服务器

    linux命令行调试邮件服务器 1. Linux客户端调试邮件过程 [root@mxtest ~]# telnet mail.xx.com 25 Trying 172.16.236.103... Co ...

  7. JS数据结构及算法(二) 队列

    队列是遵循先进先出的一种数据结构,在尾部添加新元素,并从顶部移除元素. 1.普通队列 function Queue() { this.items = []; } Queue.prototype = { ...

  8. mysql中的的按小数位截取

    format()函数返回类型是字符串,满三位会加一个逗号. 针对数字类型转换建议使用 convert或者cast函数,用法如下: format(param, 2) (不建议) convert(para ...

  9. php通过geohash算法实现查找附近的商铺

    geohash有以下几个特点: 首先,geohash用一个字符串表示经度和纬度两个坐标.利用geohash,只需在一列上应用索引即可. 其次,geohash表示的并不是一个点,而是一个矩形区域.比如编 ...

  10. Python基础(六)——面向对象编程

    (1)定义类和实例 这一部分难得和 Java 较为一致,直接写个例子: class Stu: def __init__(self, name, id): # 构造方法 self.name = name ...