DS博客作业06--图
1.本周学习总结
1.思维导图
2.谈谈你对图结构的认识及学习体会。
-
图在内容上对于树来说有很多相似的地方,这也是学习层层递进的好处,树需要一遍遍的递归,而图就不需要他需要你考虑到很多算法(在最短生成树用到两种算法,最短路径叶有两种截然不同的算法,包扩遍历都分为深度和广度遍历),所以算起来我觉得图比树还难许多,代码实现难度也比较大。
-
在最小生成树的算法上,克鲁斯卡尔算法相对于普里姆算法来说更容易理解且时间复杂度更低很适合应用在大工程上,普里姆的优点是代码更简洁很适合做Pta类的题目;在对于最短路径问题来说,狄杰斯特拉算法好理解,而弗洛伊德算法就像普里姆代码一样简洁(时间复杂度高达O(n^3))在做工程是代价较大,要想学好图,这些算法运用好就很有必要了。
-
学习图这一章的内容上和树那一章是差不多赶,许多来不及熟悉的内容。
2.PTA实验作业
- 要求挑3道题目写设计思路、调试过程。设计思路用伪代码描述。题目选做要求:题目必须是编程题,不要函数题!!
2.1.题目1:7-1 图着色问题 (25 分)
2.1.1设计思路(伪代码)
struct 结构体node a,b
替代名称 p[30000];
定义book数组(储存顶点数);
int main()
定义V,E,K代表无向图的顶点数、边数、以及颜色数;
for1 to E
cin p[i].a和p[i].b;
定义N,输入N;
while(N to 0)
set<int> s( C++ STL的set容器自动排序,便于输出的特点)
for1 to V
cin book[i],s.insertbook[i];(输入容器)
if s.size()与颜色不符 输出no
else
定义 flag=ture
for 1 to E
if a==b flag变化 break;
end for
end for
if flag=true 输出 yes else 输出no
end while
2.1.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)
2.1.3本题PTA提交列表说明。
- Q:开始用老师课堂上那个打法,发现只要改动关键点就好了,但是返现运行时间是137ms;
- A:是因为要定义多重结构体,就导致有了三个函数,所以运行时间有点长;
- A:后面看来网上的set容器有自动排序,并且能很简单返回当前set中原属个数,以及插入简单的好处,就把时间大大缩短
2.2.题目2:7-3 六度空间 (30 分)
2.2.1设计思路(伪代码)
C++标准头文件 cstdio头文件 queue队列
定义全局变量二维数组G,定义n,e(n表示人数,e社交关系数);
定义函数SixBfs(int v);
int main
输入n和e,定义 循环遍历i,j,变量a,b;
for 1 to e 输入 a,b;
G[a][b] = G[b][a] = 1 (二维数组的初始化)
end for
for 1 to n
定义 m=n,n=SixBfs(i) (依次调用SixBfs函数计算符合条件的n)
end for
return 0
int SixBfs
定义 level=0,count=1,last=v(替代传入的i),tail;
定义i, 数组visited;
申请队列空间 qu,v入队;
数组visited依次初始化;
while(qu不为空)
v出队并qu队列pop;
for 1 to n
if (G[v][i] == 1与visited[i] == 0)
count自增,i插入队尾,数组visited[i] 变化,tail=i;
end for
if last=v;
level 自增,tail=i;
if level=6(空间检索完毕)break;
end while
return count
2.2.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)
2.2.3本题PTA提交列表说明。
- Q:使用结构体数组的容量不够,调整大小错误
- A:之间用大容量的全局变量二维数组
- A:队列里的顶点都循环一遍用了队列出队的特点
2.3.题目3:7-4 公路村村通 (30 分)
2.3.1设计思路(伪代码)
C++标准头文件
定义 n,m(城镇数目,候选道路数目),定义i,j循环变量;
定义x,y,z(该条道路直接连通的两个城镇的编号以及该道路改建的预算成本),定义cost数组;
prime()函数声明;
int main()
输入n,m;fori=1 to n;
forj=1 to n
二维数组g[i][j] 最大初始化;
end for
end for;
while(m to 0)
输入x,y,z;改建预算成本初始化入城镇之间;
end while
for i=1 to n;
赋予cost 数组道路预算的值;
输出prime()函数返回;
return 0;
int prime()
定义 i,j,sum=0;
cost数组=-1;
for i=1to n;
定义min=9999999,k=-1;
for j=1to n
if(cost[j]!=-1 && cost[j]<min)(即二维数组第一列,与cost值是否小于之前初始化的值)
是就min=cost[j],k=j;
if(k不等于-1)
sum=sum+预算;
这个cost 数组再次归-1;
for j=1 to n;
if(g[k][j]<cost[j]) cost[j]=g[k][j];
end for
end for
for i=1 to n;
遍历数组看预算是否全部归置,break;
end for;
if i<=n 返回 -1
else
返回 最低成本;
2.3.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)
2.3.3本题PTA提交列表说明。
- Q:数组容量不够大
- A:增大数组大小即可
- Q:如何正确初始化
- A:额外用到cost数组辅助二维数组g初始化以及将预算存储方便计算最小成本
3、上机考试错题及处理办法
3.1 错题名称:6-1 jmu-ds-最短路径
3.1.1 截图错题代码
这题没写没有错误代码
3.1.2 正确代码:
3.1.3 错的原因及处理方法:
- Q:当时考试急,这题pta又没有遇到过直接跳过了,之后没时间写了
- A:参考了同学对这一题的解法
3.2 错题名称:7-2 公路村村通
3.2.1 截图错题代码(题集没开截图不了。。。。具体不知道错那应该是部分正确吧)
3.2.2 正确代码:(就和上面的那个截图是一样的)
3.2.3 错的原因及处理方法:
- Q:部分正确的原因记不太清了,不过应该是有试着打
- A:最后没时间了好像是cout了个-1拿了一部分分