图作业
1.学习总结
1.1图的思维导图
1.2 图结构学习体会
- 深度遍历算法:深度优先搜索,是图论中的经典算法。其利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。其的概念就是一条路走到黑。
- 广度遍历算法:广度优先是连通图的一种遍历策略。因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域。其的概念就是左看看右看看,雨露均沾。
- Prim和Kruscal算法:p-在加权连通图里搜索最小生成树。即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。由于和边数无关,和顶点树有关,所以适合求解稠密网的最小生成树。
- k-求加权连通图的最小生成树的算法。对所有权值进行从小到大排序(这里对边排序时还需要记录边的索引,这样以边的权值排完序后只改变了权值的索引位置),然后每次选取最小的权值,如果和已有点集构成环则跳过,否则加到该点集中。最终有所有的点集构成的树就是最佳的。
- Dijkstra算法:典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。注意该算法要求图中不存在负权边。
- 拓扑排序算法:是将一个有向无环图G的所有的顶点排成一个线性序列,使得有向图中的任意的顶点u 和 v 构成的弧<u, v>属于该图的边集,并且使得 u 始终是出现在 v 的前面。
2.PTA实验作业
2.1 题目1:7-1 图着色问题
2.2 设计思路(伪代码或流程图)
将数组初始化为0;
令k=0;
寻找着色规范的点;
规范则输出;
否则重新着色;
2.3 代码截图


2.4 PTA提交列表说明

刚开始未注意到不同颜色的个数相加需等于k。
以及未把c改成c++。
2.2 题目2:7-2排座位
2.2 设计思路(伪代码或流程图)
初始化并查集;
判断两人是否为朋友;
是记录是朋友 ;否记录是敌人;
输入两个宾客;
有共同朋友就输出同一张桌子;
2.3 代码截图


2.4 PTA提交列表说明

一开始不知如何判断两人是否为朋友关系,后用并查集解决,即只要判断是否处于同一棵树便能知两人是否处于同个朋友圈。
以及c未改成c++。
2.1 题目3:7-3 六度空间
2.2 设计思路(伪代码或流程图)
2.3 代码截图



2.4 PTA提交列表说明

开始时未将函数初始化,导致错误。
以及c未换成c++。
3.截图本周题目集的PTA最后排名

4. 阅读代码
void UFset() // 初始化
2 {
3 for (int i = 0; i < n; i ++)
4 parent[i] = -1;
5 }
6 int Find(int x) // 查找并返回结点x所属集合的根结点
7 {
8 int s; // 查找位置
9 for (s = x; parent[s]>=0; s = parent[s]); // 注意这里的 ;
10 while (s != x) // 优化方案 -- 压缩路径,使后续的查找
11 {
12 int tmp = parent[x];
13 parent[x] = s;
14 x = tmp;
15 }
16 return s;
17 }
18 // R1和R2是两个元素,属于两个不同的集合,现在合并这两个集合
19 void Union (int R1, int R2)
20 {
21 // r1位R1的根结点,r2位R2的根结点
22 int r1 = Find(R1), r2 = Find(R2);
23 int tmp = parent[r1] + parent[r2]; // 两个集合的结点个数之和(负数)
24 // 如果R2所在树结点个数 > R1所在树结点个数
25 // 注意parent[r1]和parent[r2]都是负数
26 if(parent[r1] > parent[r2]) // 优化方案 -- 加权法则
27 {
28 parent[r1] = r2; // 将根结点r1所在的树作为r2的子树(合并)
29 parent[r2] = tmp; // 跟新根结点r2的parent[]值
30 }
31 else
32 {
33 parent[r2] = r1; // 将根结点r2所在的树作为r1的子树(合并)
34 parent[r1] = tmp; // 跟新根结点r1的parent[]值
35 }

浙公网安备 33010602011771号