1.图(Graph)结构是一种非线性的数据结构,可以用G=(V,E)表示,每个图中都包含一个顶点集合V和一个边集合E,其中E中的每条边都是V中的某一对顶点之间的连接,顶点总数记为|V|,边的总数记为|E|,|E|的取值范围是从0到|V|平方-|V|。
关于图的一些概念:
稀疏图(sparse graph):边数较少的图。
密集图(dense graph):边数较多的图。
完全图(complete graph):包括所有可能边的图。
有向图(directed graph):一个图结构中,边是有方向性的,那么这种图就称为有向图。
无向图(undirected graph):如果一个图结构中,所有的边都没有方向性,那么这种图便称为无向图。
子图(subgraph):子图S是指从图G中选出其顶点集的一个子集Vs,以及与Vs中顶点相关联的一些边构成的子集Es所形成的图。
无环图(acyclic):不带回路的图。
有向无环图(directed acyclic graph DAG):一个无回路的有向图。如果有一个非有向无环图,且A点出发向B经C可回到A,形成一个环。将从C到A的边方向改为从A到C,则变成有向无环图。有向无环图的生成树个数等于入度非零的节点的入度积。在图论中,如果一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图。
连通图(connected graph):如果图中任意两点都是连通的,那么图被称作连通图。如果 G 是有向图,那么连接i和j的路径中所有的边都必须同向。如果此图是有向图,则称为强连通图(注意:需要双向都有路径)。(在图论中,连通图基于连通的概念。在一个无向图 G 中,若从顶点i到顶点j有路径相连(当然从j到i也一定有路径),则称i和j是连通的。)无向图的最大连通子图称为连通分量(connected component)。
强连通图(Strongly Connected Graph)是指在有向图G中,如果对于每一对vi、vj,vi≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。有向图中的极大强连通子图称做有向图的强连通分量。
弱连通图:将有向图的所有的有向边替换为无向边,所得到的图称为原图的基图。如果一个有向图的基图是连通图,则有向图是弱连通图。
单向连通图:如果有向图中,对于任意节点v1和v2,至少存在从v1到v2和从v2到v1的路径中的一条,则原图为单向连通图。即设G=<V,E>是有向图,如果u->v意味着图G至多包含一条从u到v的简单路径,则图G为单连通图。
强连通图、连通图、单向连通图三者之间的关系是,强连通图必然是单向连通的,单向连通图必然是弱连通图

无向完全图(undirected complete graph):如果在一个无向图中, 每两个顶点之间都存在条边,那么这种图结构称为无向完全图。
有向完全图(directed complete graph):如果在一个有向图中,每两个顶点之间都存在方向相反的两条边,那么这种图结构称为有向完全图。
自由树(free tree):不带简单回路的连通无向图。(图的顶点序列中,除了第一个顶点和最后一个顶点相同外,其余顶点不重复出现的回路叫简单回路。或者说,若通路或回路不重复地包含相同的边,则它是简单的。)
2.图有两种常见的表示方法:I.相邻矩阵(adjacency matrix)表示法 空间代价:θ(|V|平方) II.邻接表(adjacency list)表示法 空间代价:θ(|V|+|E|)
3.图的实现
4.图的遍历(graph traversal):
I.深度优先搜索(depth-first search,DFS):利用栈
II.广度优先搜索(breadth-first search,BFS):利用队列
5.最短路径问题:
(1)单元最短路径问题:给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。
两种解决算法:I.Dijkstra II.Bellman-Ford
6.最小支撑树问题:设G=(V,E)是一个无向连通网,生成树上各边的权值之和为该生成树的代价,在G的所有生成树中,代价最小的生成树就称为最小支撑树,或称最小生成树。 ||||||另一种定义:MST是一个包括图G中的所有顶点及其一部分边的图,这些边都是图G所有边集合的子集,这些边满足下列条件:I.这个子集中所有边的权之和为所有子集中最小的 II.子集中的边能保证图是连通的
两种解决算法:I.Kruskal II.Prim

从以往考题来讲,图还是以从图构造的存储空间,理解相邻矩阵和邻接表(链表)两种实现图的方式。学会Dijk算法,Prim算法,Kruskal算法
Dijkstra:

class DijkElem{friend bool operator<(const DijkElem& r1,const DijkElem& r2) {return r1.distance < r2.distance;}public:   // To convinent the application, make the distance and vertex publicint vertex, distance;DijkElem()  { vertex = -1; distance = -1;  }  // Default constructorDijkElem(int v, int d){vertex = v;distance = d;}
};// A operation is lacking : make the precise load // Dijkstra's shortest paths algorithm with priority queue
void Dijkstra(int* D, int s){   // D is used to store the current shortest loadint i, v, w;  // v is current vertexDijkElem temp;DijkElem E[e()];   // Heap array with lots of spacetemp.distance = 0;temp.vertex = s;E[0] = temp;   // Initialize heap arrayheap<DijkElem>  H(E, 1, e());   // Create heapfor(i = 0; i < n(); i++){   // Now, get distancesdo{if(H.size() == 0)  return;   // Nothing to removetemp = H.removefirst();v = temp.vertex;}while (getMark(v) == 1);setMark(v,1);if (D[v] == 100)   return;       // Unreachable verticesfor(w = first(v); w <= n(); w = next(v,w)){if(D[w] > (D[v] + weight(v,w))){   // Update DD[w] = D[v] + weight(v,w);pre[w] = v;temp.distance = D[w];temp.vertex = w;H.insert(temp);    // Insert new distance in heap}}}}

Prim:

class sortelem{friend bool operator < (const sortelem& r1,const sortelem& r2) {if(r1.weight != r2.weight) return r1.weight < r2.weight;else{int temp1,temp2;temp1 = r1.v1 < r1.v2 ? r1.v1 : r1.v2;temp2 = r2.v1 < r2.v2 ? r2.v1 : r2.v2;return temp1 < temp2;}}public:int v1,v2,weight;    // weight is the weight between v1 and v2
};void Prim(sortelem MST[],int* D, int s){   // D is used to store the current shortest loadint i, v, w;  // v is current vertexint V[n() + 1];   // V[I] stores I's closest neighborfor(int i = 0;i <= n();i++)  V[i] = i;DijkElem temp;sortelem temp1;DijkElem E[e()];   // Heap array with lots of spacetemp.distance = 0;temp.vertex = s;E[0] = temp;   // Initialize heap arrayheap<DijkElem>  H(E, 1, e());   // Create heapheap<sortelem> H2(MST,0,e());for(i = 0; i < n(); i++){   // Now, build MSTdo{if(H.size() == 0)  {   // Nothing to removewhile(H2.size() != 0){temp1 = H2.removefirst();if(temp1.v1 < temp1.v2) cout<<temp1.v1<<" "<<temp1.v2<<" ";else cout<<temp1.v2<<" "<<temp1.v1<<" ";cout<<temp1.weight<<endl;}    return;}temp = H.removefirst();v = temp.vertex;}while (getMark(v) == 1);setMark(v,1);if( v != s)  {     temp1.v1 = V[v];temp1.v2 = v;temp1.weight = weight(V[v],v);H2.insert(temp1);}if (D[v] == 100)   return;       // Unreachable verticesfor(w = first(v); w <= n(); w = next(v,w)){if(D[w] > weight(v,w)){   // Update DD[w] =  weight(v,w);V[w] = v;   // Update who it came fromtemp.distance = D[w];temp.vertex = w;H.insert(temp);    // Insert new distance in heap}}}}

DFS,BFS:

void DFS(int v,int count){   // Depth first searchcount++;if(count != 6)  cout<<v<<" ";else cout<<v;setMark(v,1);   // Have visted a vertexfor(int w = first(v); w <= n(); w = next(v,w)){if(getMark(w) == 0)  DFS(w,count);}
}void BFS(int start,AQueue<int> &Q,int count){  // Breadth first searchint v, w;Q.enqueue(start);   // Initialize QsetMark(start,1);    // Mark the visted vertexwhile(Q.length() != 0){   // Process all vertices on Qv = Q.dequeue();count++;if(count != 6) cout<<v<<" ";else  cout<<v;for(w = first(v); w <= n(); w = next(v,w)){if(getMark(w) == 0){setMark(w,1);Q.enqueue(w);}}}cout<<endl;
}

以上算法都是在图中实现,有用到图的一些基本操作函数

数据结构与算法分析 收获总结 第11章 图相关推荐

  1. 数据结构与算法分析 收获总结 第1章 数据结构和算法

    这学期学这门课到现在为止,还是感觉难度很大,当然老师可能讲得也有点偏离书本,有时候听得有点蒙. 干脆来根据教材写个总结,用的教材是 <数据结构与算法分析>C++ 第3版 电子工业出版社 第 ...

  2. 【Java数据结构与算法】第十六章 图

    第十六章 图 文章目录 第十六章 图 一.图 1.介绍 2.基本术语 3.邻接矩阵 4.邻接表和逆邻接表 5.十字链表 二.深度优先遍历 三.广度优先遍历 四.代码实现 一.图 1.介绍 图相较于前面 ...

  3. 数据结构与算法王卓-习题-第六章图-采用邻接矩阵表示图的深度优先搜索遍历(DFS)算法

    目录 算法描述 算法预期效果 重难点 思路 个人解法 测试样例与输出 算法描述 创建图的邻接矩阵, 并输出dfs深度优先搜索遍历结果 算法预期效果 依次输入顶点数,边数,顶点V1~Vn,边A1~An, ...

  4. 数据结构与算法分析(C++版)(第二版)

    查看书籍详细信息: 数据结构与算法分析(C++版)(第二版) 内容简介 本书采用程序员最爱用的面向对象C++语言来描述数据结构和算法,并把数据结构原理和算法分析技术有机地结合在一起,系统介绍了各种类型 ...

  5. 数据结构与算法分析-第2章

    <?xml version="1.0" encoding="utf-8"?> 数据结构与算法分析-第2章 数据结构与算法分析-第2章 Table o ...

  6. 《Python数据结构与算法分析》第一章课后习题

    这里写自定义目录标题 Introduction 练习题 Python易错总结: Introduction 最近开始学数据结构,打算用python作为语言,看的书是米勒和戴维的<Python数据结 ...

  7. 11-1-败者树-外部排序-第11章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第11章  外部排序 - 败者树 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码 ...

  8. 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案...

    转自:http://www.linuxidc.com/Linux/2014-04/99735.htm 数据结构与算法分析:C语言描述(原书第2版中文版!!!) PDF+源代码+习题答案 数据结构与算法 ...

  9. 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21

    大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...

最新文章

  1. Android 应用程序集成Google 登录及二次封装
  2. 知名大学4篇学术论文被撤!校方:已做相关取证!
  3. 湖北黄冈中学2021年高考成绩查询,【喜报】2020年黄冈中学高考成绩出炉,600分以上人数556人...
  4. JS替换空格回车换行符
  5. OS之内存管理 ---基本的内存管理策略(二)
  6. 6410 linux内核移植
  7. 11月AI大事件回顾:GPT3开放使用/女娲视觉大模型/AE文艺复兴/...
  8. c盘java文件误删_java获取C盘下的隐藏目录文件名称
  9. java集合框架类_Java集合框架总结—超详细-适合面试
  10. linux shell 当前用户名,在Linux中使用Whoami命令显示当前登录用户名称及替代命令的方法...
  11. Mac查看Python安装路径和版本
  12. 创建SSIS包—建立端到端的package
  13. Linux:struct dirent
  14. 前端常用PS技巧总结之更换图片背景图片
  15. 我叫MT online 公会BOSS百分比、难度、BOSS技能及站位
  16. JTA transaction unexpectedly rolled back (maybe due to a timeout)
  17. 计算机学院志愿公益活动,计算机科学与技术学院志愿者走进“君子残疾人之家”...
  18. Cobaltstrike系列教程(十)安装扩展
  19. 3D打印机Marlin 固件 改12864引脚 不显示白屏的问题
  20. 怎么打开华硕电脑计算机功能,华硕笔记本小键盘怎么开(笔记本电脑虚拟键盘怎么打开)...

热门文章

  1. 电脑硬盘主分区和逻辑分区的区别是什么
  2. 海南“多规合一”改革促行政审批提速城乡面貌提质
  3. android studio虚拟机无法启动 The system requirements are not satisfied、vmx enabled no、vmx supported no
  4. SAP idoc功能够强大: 采购订单下达自动触发销售订单创建
  5. php用户权限分配方法,php – 在Laravel 5中使用Entrust为用户分配权限,而不是角色...
  6. spring boot中小学餐饮配送系统 毕业设计-附源码645661
  7. 计算机管理文件破坏怎么办,文件损坏,教您电脑文件损坏怎么修复
  8. 关于命令注入的一些介绍
  9. 科研人必备英语改写神器——PARAPHRASER多语言改写
  10. 漫谈CRM体系化建设2 – 如何开发客户?