Section-1 Traverse
第1节 遍历
图(Graph)
图G=<V,E>是由顶点集合V和边集合E组成的数据结构。一个边连接两个顶点,若两顶点u和v为一条边的两个端点,则称u和v相邻。
图G的子图的所有顶点和边都属于图G。
完全图(Complete Graph)的所有顶点两两相邻。如下图所示:
有向图(Directed Graph)/无向图(Undirected Graph)
无向边e的两端点是u和v,表示既可以从u到达v,也可以从v到达u。有向边e从u指向v,表示只能从u到达v,而不能反向。一条无向边也可以看作两条方向相反,端点相同的有向边的组合。
所有边都是无向边的图为无向图(Undirected Graph),所有边都是有向边的图为有向图(Directed Graph)。
度数(Degree)/出度(Out Degree)/入度(In Degree)
节点u的出度(Out Degree)是从节点u出发的边的数量,也称为出度度数,从节点u出发的边称为出弧边。无向图的顶点u的所有边都可以看作出弧边,即节点的边数等于出度。
节点u的入度(In Degree)是到达(指向)节点u的边的数量,也称为入度度数,到达节点u的边称为入弧边。无向图的顶点u的所有边都可以看作入弧边,即节点的边数等于入度。无向图中每个节点的出度和入度相等。
节点u所关联的边数,称作该节点的度数(Degree)。无向图中节点vi的度数等于边的数量,等于出度度数,等于入度度数。有向图中任意节点vi的度数等于出度度数与入度度数之和。如下图所示:
上面两个图,图A为有向图,节点[0,5]的出度分别为[2,2,1,1,2,1],入度分别为[1,1,2,2,0,2]。图B为无向图,节点[0,5]的出度分别为[3,4,3,3,2,3],入度与出度一样。
一般用n×n的矩阵表示一个拥有n个节点的图G,节点范围为[0,n−1]。G[i,j]表示从节点i到j的距离(i,j∈[0,n−1]),或节点i是否可以直接到达节点j,等等信息。注意节点i到自己的距离为0,不能到达自己。上图中A和B可以表示为矩阵:
A=000010100001010100010010000000101000B=010011101101010101011010100100111000 环(Cycle)
若图G中对于顶点vi,存在一条路径从它出发可以到达自己,则称该路径为一个环。不存在环的图称为无环图,存在环的图称为有环图。完全图都是有环图。
拓扑排序(Topological Sort)
拓扑排序(Topological Sort)是有向无环图中所有顶点按照依赖进行的排序。
设完成任务j需要先完成任务i,则任务j依赖任务i。用有向图表示这一组任务的完成过程这样存在依赖关系的n个任务,即存在边ei,j从顶点vi指向vj,最终得到一个有向无环图。如下图所示:
路径(Path)/回路(Cycle)
图G的路径(Path)是一组边的有序集合,表示随着时间依次经过的边的顺序。回路(Cycle)是起点和终点相同的路径。
欧拉路径(Eulerian Path)/欧拉回路(Eulerian Cycle)
欧拉路径(Eulerian Path)经过图G中每条边一次且仅一次(同一个顶点可以经过多次),遍历所有边。
判断欧拉路径:
(1) 判断有向图是否存在欧拉路径:有向图DG中存在一个起始顶点v0满足出度比入度大1(out1=in1+1),存在一个终止顶点v1满足入度比出度大1(in2=out2+1),其余所有顶点的入度等于出度,则该有向图DG中存在欧拉路经;
(2) 判断无向图是否存在欧拉路径:无向图UG中存在两个顶点v0和v1满足度数为奇数,其余节点的度数都是偶数,则该无向图UG中存在欧拉路经;
欧拉回路(Eulerian Cycle)是既是欧拉路径又是回路的路径。
判断欧拉回路:
(1) 判断有向图是否存在欧拉回路:有向图DG的任意顶点vi满足ini=outi,出度等于入度,则该有向图DG中存在欧拉回路;
(2) 判断无向图是否存在欧拉回路:无向图UG的任意顶点vi满足度数为偶数,则该无向图DG中存在欧拉回路;
拥有欧拉回路的图G称为欧拉图(Eulerian Graph)。
汉密尔顿路径(Hamilton Path)/哈密尔顿回路(Hamilton Cycle)
汉密尔顿路径(Hamilton Path)经过图G中每个顶点一次且仅一次(同一条边可以经过多次),遍历所有顶点。求解汉密尔顿路径是一个NP完全问题。
哈密尔顿回路(Hamilton Cycle)是既是哈密尔顿路径又是回路的路径。
拥有汉密尔顿回路的图G称为汉密尔顿图。完全图必然是汉密尔顿图。
Introduction To Algorithms
图论术语