📜  离散数学-有关图的更多信息

📅  最后修改于: 2021-01-08 06:11:12             🧑  作者: Mango


图形着色

图形着色是将颜色分配给图形G的每个顶点的过程,以使相邻的顶点不会获得相同的颜色。目的是在给图形着色时最大程度地减少颜色数量。使图G着色所需的最小数量的颜色称为该图的色数。图形着色问题是NP完全问题。

着色图形的方法

为具有n个顶点的图G着色所需的步骤如下-

步骤1-以某种顺序排列图的顶点。

步骤2-选择第一个顶点并用第一种颜色对其进行着色。

步骤3-选择下一个顶点,并以编号最小的颜色对其进行着色,该颜色在与之相邻的任何顶点上都未着色。如果所有相邻的顶点都以此颜色上色,请为其分配新的颜色。重复此步骤,直到所有顶点都着色为止。

图形着色

在上图中,第一个顶点$ a $被涂成红色。由于顶点a的相邻顶点再次相邻,所以顶点$ b $和顶点$ d $分别用不同的颜色(绿色和蓝色)着色。然后,顶点$ c $被涂成红色,因为没有相邻的顶点$ c $被涂成红色。因此,我们可以用3种颜色为图表着色。因此,该图的色数为3。

图形着色的应用

图形着色的一些应用包括-

图遍历

图遍历是按某种系统顺序访问图的所有顶点的问题。遍历图主要有两种方法。

  • 广度优先搜索
  • 深度优先搜索

广度优先搜索

广度优先搜索(BFS)从图形$ G $的第0层顶点$ X $开始。然后,我们访问与$ X $相邻的所有顶点。访问后,我们将这些顶点标记为“已访问”,并将其置于1级。然后,我们从1级顶点开始,并对每个1级顶点应用相同的方法,依此类推。当访问图的每个顶点时,BFS遍历就会终止。

BFS算法

该概念是在访问邻居顶点的其他邻居顶点之前访问所有邻居顶点。

  • 将所有节点的状态初始化为“就绪”。

  • 将源顶点放入队列中,并将其状态更改为“等待”。

  • 重复以下两个步骤,直到队列为空-

    • 从队列中删除第一个顶点,并将其标记为“已访问”。

    • 将状态为“就绪”的已删除顶点的所有邻居添加到队列的尾部。将其状态标记为“正在等待”。

问题

让我们拍一个图(源顶点为“ a”),然后应用BFS算法找出遍历顺序。

广度优先搜索图

解决方案

  • 将所有顶点的状态初始化为“就绪”。

  • 一个队列和其状态更改为“等待”。

  • 从队列中删除一个,将其标记为“已访问”。

  • 添加的邻居在‘就绪’状态B,de结束队列,并将其标记为‘等待’。

  • 从队列中删除b ,将其标记为“已访问”,将其“就绪”邻居c放置在队列末尾,并将c标记为“等待”。

  • 从队列中删除d并将其标记为“已访问”。它没有邻居处于“就绪”状态。

  • 从队列中删除e并将其标记为“访问”。它没有邻居处于“就绪”状态。

  • 从队列中删除c并将其标记为“访问”。它没有邻居处于“就绪”状态。

  • 队列为空,请停止。

因此遍历顺序为-

$ a \ rightarrow b \ rightarrow d \ rightarrow e \ rightarrow c $

遍历的替代顺序是-

$ a \ rightarrow b \ rightarrow e \ rightarrow d \ rightarrow c $

$ a \ rightarrow d \ rightarrow b \ rightarrow e \ rightarrow c $

$ a \ rightarrow e \ rightarrow b \ rightarrow d \ rightarrow c $

$ a \ rightarrow b \ rightarrow e \ rightarrow d \ rightarrow c $

$ a \ rightarrow d \ rightarrow e \ rightarrow b \ rightarrow c $

BFS的应用

  • 寻找最短路径
  • 非加权图的最小生成树
  • GPS导航系统
  • 在无向图中检测周期
  • 查找一个连接的组件中的所有节点

复杂度分析

令$ G(V,E)$为具有$ | V | $顶点数和$ | E | $边数的图。如果广度优先搜索算法访问图形中的每个顶点并检查每个边缘,则其时间复杂度将为-

$$ O(| V | + | E |)。 O(| E |)$$

它可能在$ O(1)$和$ O(| V2 |)$之间变化

深度优先搜索

深度优先搜索(DFS)算法从顶点$ v $开始,然后遍历到之前未访问过的相邻顶点(例如x),并将其标记为“已访问”,并继续与相邻顶点$ x $和以此类推。

如果在任何一个顶点上遇到所有相邻顶点都已访问过,则它将回溯直到找到具有一个之前尚未遍历的相邻顶点的第一个顶点。然后,它遍历该顶点,继续其相邻的顶点,直到遍历所有访问的顶点并不得不再次回溯。这样,它将遍历从初始顶点$ v $可以到达的所有顶点。

DFS算法

该概念是在访问其他相邻顶点之前访问相邻顶点的所有相邻顶点。

  • 将所有节点的状态初始化为“就绪”

  • 将源顶点放在堆栈中,并将其状态更改为“等待”

  • 重复以下两个步骤,直到堆栈为空-

    • 从堆栈中弹出顶部顶点,并将其标记为“已访问”

    • 将状态为“就绪”的已移除顶点的所有邻居推入堆栈的顶部。将其状态标记为“正在等待”。

问题

让我们拍一个图(源顶点为“ a”)并应用DFS算法找出遍历顺序。

深度优先搜索图

  • 将所有顶点的状态初始化为“就绪”。

  • 在压栈其状态更改为“等待”。

  • 弹出一个并将其标记为“访问过”。

  • 处于“就绪”状态的e,db的邻居推入堆栈顶部,并将其标记为“正在等待”。

  • 从堆栈中弹出b ,将其标记为“已访问”,将其“就绪”邻居c推入堆栈。

  • 从堆栈中弹出c并将其标记为“访问”。它没有“就绪”邻居。

  • 从堆栈中弹出d并将其标记为“已访问”。它没有“就绪”邻居。

  • 从堆栈弹出e并将其标记为“访问”。它没有“就绪”邻居。

  • 堆栈为空。所以停止。

因此遍历顺序为-

$ a \ rightarrow b \ rightarrow c \ rightarrow d \ rightarrow e $

遍历的替代顺序是-

$ a \ rightarrow e \ rightarrow b \ rightarrow c \ rightarrow d $

$ a \ rightarrow b \ rightarrow e \ rightarrow c \ rightarrow d $

$ a \ rightarrow d \ rightarrow e \ rightarrow b \ rightarrow c $

$ a \ rightarrow d \ rightarrow c \ rightarrow e \ rightarrow b $

$ a \ rightarrow d \ rightarrow c \ rightarrow b \ rightarrow e $

复杂度分析

令$ G(V,E)$为具有$ | V | $顶点数和$ | E | $边数的图。如果DFS算法访问图形中的每个顶点并检查每个边缘,则时间复杂度为-

$$ \ circleddash(| V | + | E |)$$

应用领域

  • 检测图中的周期
  • 查找拓扑排序
  • 测试图是否为二部图
  • 查找连接的组件
  • 寻找图的桥梁
  • 在图形中查找双向连接
  • 解决骑士之旅问题
  • 仅用一种解决方案即可解决难题