1.学习总结
1.1图的思维导图
1.2 图结构学习体会
深度遍历算法:
访问顶点v
依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径想通的顶点都被访问;
若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所以顶点均被访问过为止;
通过递归实现
广度遍历算法:
访问顶点V
访问V的所有未被访问的邻接点;
依次从这些邻接点出发,访问它们所有未被访问的邻接点,直到图中所以访问过的顶点的邻接都被访问;
通过队列实现
Prim和Kruscal算法:
最小生成树可以使用prim算法和Kruscal算法实现,对于稀疏图来说,用Kruscal算法效率更好,加上并查集可对其进行优化;
Kruscal在所有边中不断寻找最小的边,prim在U和V两个集合之间寻找最小的连接,共同点是构造过程中都不能形成环;
Prim适合稠密图,因此通常使用邻接矩阵存储,而Kruscal多用邻接表,稠密图Prim>Kruscal,稀疏图Kruscal>Prim;
Prim适合点少边多,Kruscal适合边多点少;
Dijkstra算法:
贪心算法,最短路径问题
以起始点为中心向外层层扩展,直到扩展到终点为止;
拓扑排序算法:
只有有向无环图才可以进行拓扑排序
从AOE网中选择一个没有前驱的顶点(该顶点的入度为0)并且输出它;
从网中删去该顶点,并且删去从该顶点发出的全部有向边;
重复上述两步,直到剩余的网中不再存在没有前驱的顶点为止;
2.PTA实验作业
2.1 题目1:图着色问题
2.2 设计思路
定义变量i,j 定义变量 v顶点数 e边数 k颜色数 定义变量 a,b为两个端点的编号 num为方案的个数 数组color[] vector和 set 输入v e k for i=0 to e 输入a b并添加到容器末尾 输入 num while(num--) bool flag=true for i=1 to v 输入数组color[i]并插入容器 if 容器大小 不等于k flag=false for i=1 to v for j=0 to mp[i].size() if color[i]等于color[mp[i][j]] flag=false break if非flag break if flag 输出Yes else 输出No
2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
2.4 PTA提交列表说明。
2.1 题目2:排座位
2.2 设计思路
find() join(int x,int y) 将两个集合合并 定义fx=find(x); 定义 fy=find(y); if不在一个集合 pre[fx]=fy; same(int x,int y) 判断两个元素是否在同一个集合中 if 在 返回 true; else 返回 false main() 定义 a,b,c,n,m,t,i; 输入n m t for i=1 to n pre[i]=i; for i=1 to m 输入 a b c 记录直接的对应关系 if c等于1 调用函数join(a,b)判断间接关系 for i=1 to t 输入 a b if 是朋友 输出 No problem else if 有敌对也有共同朋友 输出OK but... else if 不是朋友,但也不敌对 输出OK else if 敌对关系No way end
2.3 代码截图
2.4 PTA提交列表说明。
2.1 题目3:
3.截图本周题目集的PTA最后排名
3.1 PTA排名
3.2 我的总分:140
4. 阅读代码(必做,1分)