📅  最后修改于: 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,d和e结束队列,并将其标记为‘等待’。
从队列中删除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的应用
复杂度分析
令$ G(V,E)$为具有$ | V | $顶点数和$ | E | $边数的图。如果广度优先搜索算法访问图形中的每个顶点并检查每个边缘,则其时间复杂度将为-
$$ O(| V | + | E |)。 O(| E |)$$
它可能在$ O(1)$和$ O(| V2 |)$之间变化
深度优先搜索(DFS)算法从顶点$ v $开始,然后遍历到之前未访问过的相邻顶点(例如x),并将其标记为“已访问”,并继续与相邻顶点$ x $和以此类推。
如果在任何一个顶点上遇到所有相邻顶点都已访问过,则它将回溯直到找到具有一个之前尚未遍历的相邻顶点的第一个顶点。然后,它遍历该顶点,继续其相邻的顶点,直到遍历所有访问的顶点并不得不再次回溯。这样,它将遍历从初始顶点$ v $可以到达的所有顶点。
DFS算法
该概念是在访问其他相邻顶点之前访问相邻顶点的所有相邻顶点。
将所有节点的状态初始化为“就绪”
将源顶点放在堆栈中,并将其状态更改为“等待”
重复以下两个步骤,直到堆栈为空-
从堆栈中弹出顶部顶点,并将其标记为“已访问”
将状态为“就绪”的已移除顶点的所有邻居推入堆栈的顶部。将其状态标记为“正在等待”。
问题
让我们拍一个图(源顶点为“ a”)并应用DFS算法找出遍历顺序。
解
将所有顶点的状态初始化为“就绪”。
在压栈和其状态更改为“等待”。
弹出一个并将其标记为“访问过”。
将处于“就绪”状态的e,d和b的邻居推入堆栈顶部,并将其标记为“正在等待”。
从堆栈中弹出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 |)$$
应用领域