20162328 2017-2018-1 《程序设计与数据结构》第十一周学习总结

教材学习内容总结

在无向图中,表示边的顶点对是无序的。

如果图中的两个顶点之间有边链接,则称它们是领接的。

如果无向图中连接顶点的边数达到最大,则称为完全图。

路径是图中连接两个顶点的边的序列。

第一个顶点和最后一个顶点相图且边不重复的路径称为环。

在有向图中,边是顶点的有序对。

有向图中的路径是连接图中两个顶点的有向边的序列。

图的每条边上都有对应的权值的图称为带权图。

图的深度优先遍历与广度优先遍历的主要差异在于用栈代替队列来管理便利的过程。

当且仅当从任意顶点的广度优先遍历中得到的顶点数等于图中所含的顶点数时,图是连通的。

生成树是包含图中所有顶点及图中部分边的一棵树。

生成最小树是其所含边的权值小于等于图的任意其他生成树的边的权值之和的生成树。

深度优先遍历

1.访问数组初始化:visited[n] = 0

2.访问顶点:visited[v] = 1

3.取v的第一个邻接点w;

4.循环递归:

while(w存在)

if(w未被访问过)

从顶点w出发递归执行;

w = v的下一个邻接点;

广度优先遍历

  1. 初始化队列:visited[n] = 0
  2. 访问顶点:visited[v] = 1
  3. 顶点v加入队列
  4. 循环:

    while(队列是否为空)

    v = 队列头元素

    w = v的第一个邻接点

    while(w存在)

    if(如果w未访问)

    visited[w] = 1;

    顶点w加入队列

    w = 顶点v的下一个邻接点

有向图,无向图

如果给图的每条边规定一个方向,那么得到的图称为有向图,其边也称为有向边。在有向图中,与一个节点相关联的边有出边和入边之分,而与一个有向边关联的两个点也有始点和终点之分。相反,边没有方向的图称为无向图。

带权图

在处理有关图的实际问题时,往往有值的存在,比如公里数,运费,城市,人口数以及电话部数等。一般这个值成为权值,带权值的图称为带权图或赋权图。也称为网。

最小生成树算法

  1. public class WeightedGraph {
  2. private final int MAX_VERTS = 20; //最大顶点数
  3. private final int INFINITY = 100000; //最远距离...表示无法达到
  4. private Vertex[] vertexArray; //存储顶点的数组
  5. private int adjMat[][]; //存储顶点之间的边界
  6. private int nVerts; //顶点数量
  7. private int currentVert; //当前顶点索引
  8. private PriorityQ thePQ; //存储边的优先级队列
  9. private int nTree; //最小生成树中的顶点数量
  10. public WeightedGraph() {
  11. vertexArray = new Vertex[MAX_VERTS];
  12. adjMat = new int[MAX_VERTS][MAX_VERTS];
  13. for(int i = 0; i < MAX_VERTS; i++) {
  14. for(int j = 0; j < MAX_VERTS; j++) {
  15. adjMat[i][j] = INFINITY; //初始化所有边界无穷远
  16. }
  17. }
  18. thePQ = new PriorityQ();
  19. }
  20. public void addVertex(char lab) { //添加顶点
  21. vertexArray[nVerts++] = new Vertex(lab);
  22. }
  23. public void addEdge(int start, int end, int weight) {//添加带权边
  24. adjMat[start][end] = weight;
  25. adjMat[end][start] = weight;
  26. }
  27. public void displayVertex(int v) {
  28. System.out.print(vertexArray[v].label);
  29. }
  30. /*
  31. * 带权图的最小生成树,要选择一条最优的路径
  32. */
  33. public void MinSpanningTree() {
  34. currentVert = 0; //从0开始
  35. while(nTree < nVerts-1) { //当不是所有节点都在最小生成树中时
  36. //isInTree是上一节Vertex类中新添加的成员变量 private boolean isInTree;
  37. //表示有没有加入到树中,初始化为false
  38. vertexArray[currentVert].isInTree = true; //将当前顶点加到树中
  39. nTree++;
  40. //往PQ中插入与当前顶点相邻的一些边界
  41. for(int i = 0; i < nVerts; i++) {
  42. if(i == currentVert) //如果是本顶点,跳出
  43. continue;
  44. if(vertexArray[i].isInTree) //如果顶点i已经在树中,跳出
  45. continue;
  46. int distance = adjMat[currentVert][i]; //计算当前顶点到i顶点的距离
  47. if(distance == INFINITY)
  48. continue; //如果当前顶点与i顶点无穷远,跳出
  49. putInPQ(i, distance); //将i节点加入PQ中
  50. }
  51. if(thePQ.size() == 0) { //如果PQ为空,表示图不连接
  52. System.out.println("Graph not connected!");
  53. return;
  54. }
  55. Edge theEdge = thePQ.removeMin();
  56. int sourceVert = theEdge.srcVert;
  57. currentVert = theEdge.destVert;
  58. System.out.print(vertexArray[sourceVert].label);//这里就是一步步打印最小生成树的路径
  59. System.out.print(vertexArray[currentVert].label);
  60. System.out.print(" ");
  61. }
  62. }
  63. //这个方法是将一个Edge放入优先级队列,保证队列中每个Edge的des顶点是不同的。
  64. private void putInPQ(int newVert, int newDist) {
  65. int queueIndex = thePQ.find(newVert);//判断PQ中是否已经有到相同目的顶点的边界
  66. if(queueIndex != -1) { //如果有则与当前顶点到目的顶点的距离作比较,保留短的那个
  67. Edge tempEdge = thePQ.peekN(queueIndex);//get edge
  68. int oldDist = tempEdge.distance;
  69. if(oldDist > newDist) { //如果新的边界更短
  70. thePQ.removeN(queueIndex); //删除旧边界
  71. Edge theEdge = new Edge(currentVert, newVert, newDist);
  72. thePQ.insert(theEdge);
  73. }
  74. }
  75. else { //如果PQ中没有到相同目的顶点的边界
  76. Edge theEdge = new Edge(currentVert, newVert, newDist);
  77. thePQ.insert(theEdge);//直接添加到PQ
  78. }
  79. }
  80. }

20162328蔡文琛 week11 大二的更多相关文章

  1. 20162328蔡文琛 week09 大二

    20162328蔡文琛 大二week09 教材学习内容总结 堆是一棵完全二叉树,其中每个元素大于等于其所有子节点的值. 向堆中添加一个元素的方法是,首先将这个元素添加为叶节点然后将其向上移动到合适的位 ...

  2. 20162328蔡文琛 week05 大二

    20162328 2017-2018-1 <程序设计与数据结构>第5周学习总结 教材学习内容总结 集合是收集元素并组织其他对象的对象. 集合中的元素一般由加入集合的次序或元素之间的某些固有 ...

  3. 20162328蔡文琛 week10 大二

    20162328 2017-2018-1 <程序设计与数据结构>第十周学习总结 教材学习内容总结 理解图与有向图.无向图 理解带权图 会应用带权图 理解图的广度优先遍历和深度优先遍历 掌握 ...

  4. 20162328蔡文琛 week06 大二

    20162328 2017-2018-1 <程序设计与数据结构>第6周学习总结 教材学习内容总结 队列元素按FIFO的方式处理----最先进入的元素最先离开. 队列是保存重复编码k值得一种 ...

  5. 20162328蔡文琛 大二week07

    20162328 2017-2018-1 <程序设计与数据结构>第7周学习总结 教材学习内容总结 树是非线性结构,其元素组织为一个层次结构. 树的度表示树种任意节点的最大子节点数. 有m个 ...

  6. 20162328蔡文琛 大二 十二周课上测试 hash

  7. 20162328蔡文琛 大二week01

    教材学习内容总结 算法+程序机构=程序 渐进复杂度称为算法的阶. 算法分析是计算机科学的基础课题. 增长函数显示了与问题大小相关的时间或空间的利用率. 算法的阶由算法增长函数的主项决定. 算法的阶给出 ...

  8. 20162328蔡文琛week04

    学号 20162328 <程序设计与数据结构>第4周学习总结 教材学习内容总结 本周学习了第四章和第七章,第四章中的内容已经有了初步定的掌握,布尔表达式的运用,是条件和循环语句的基础及数组 ...

  9. 20162328蔡文琛 2017week03

    20162328 2017-2018-1 <程序设计与数据结构>第3周学习总结 教材学习内容总结 查找是在一组项内找到指定目标或是确定目标不存在的过程. 搞笑的查找使得比较的次数最少. C ...

随机推荐

  1. KMP算法之从懵逼到入门

    写本文的目的: 1.加深自己的理解,以便自己日后复习 2.给看到此文的人一点启发 KMP算法看懂了就觉得特别简单,思路也好理解,但是看不懂之前,查各种资料看大佬的博客,都很懵逼...... 1.  算 ...

  2. #leetcode刷题之路42-接雨水

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水.上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 ...

  3. 基于 Keras 用 LSTM 网络做时间序列预测

    目录 基于 Keras 用 LSTM 网络做时间序列预测 问题描述 长短记忆网络 LSTM 网络回归 LSTM 网络回归结合窗口法 基于时间步的 LSTM 网络回归 在批量训练之间保持 LSTM 的记 ...

  4. scribe日志系统安装笔记

    版本历史 2011-02-12 17:36:57 完成文章2011-02-23 10:49:12 更新,修正部分文字 目前web访问日志为crontab定时清空,而且负载均衡后,访问随机分配到一台服务 ...

  5. jQuery学习-属性选择器

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 【JLOI2013】卡牌游戏

    题面 题解 概率$dp$ 设$f[i][j]$表示还剩$i$个人时,第$j$个人获胜的概率. 边界$f[1][1] = 1$ 转移: 枚举庄家抽到的卡牌$k$,得到这一轮被淘汰的位置$c$. 可以知道 ...

  7. .Net Core 管道机制

    开篇先上一张中间件原理图,帮助大家对管道机制形成一个直观的认识 下面我们实现一个简单的管道机制,以此为例深入理解管道机制的原理 1. 首先定义一个委托,该委托接收一个上下文对象,返回值为Task,代码 ...

  8. SSIS 数据流的错误输出

    数据流任务对错误的处理,和控制流不同,在数据流中,主要是对于错误行的处理,一般通过Error Output配置. 1,操作失败的类型:Error(Conversion) 和 Truncation. 2 ...

  9. Async方法死锁的问题 Don't Block on Async Code(转)

    今天调试requet.GetRequestStreamAsync异步方法出现不返回的问题,可能是死锁了.看到老外一篇文章解释了异步方法死锁的问题,懒的翻译,直接搬过来了. http://blog.st ...

  10. python+appium 实现qq聊天的消息,滑动删除聊天消息

    有人问我,appium怎么去删除qq聊天的, 当时想到的是滑动, 可是具体的大概有个思路,于是乎,就想自己来实现下, 打开模拟器,开发者选项,找到显示坐标的 然后去打开qq获取要删除的消息的坐标后, ...