Existen tales problemas en la teoría de grafos, que involucran diagramas de Euler, trayectorias de Euler (problemas de un solo trazo) y circuitos de Euler. Este artículo da su definición (no rigurosa), algunas conclusiones y finalmente el algoritmo de Hierholzer y los correspondientes ejemplos y respuestas.
Definición (no rigurosa)
Para un 连通的
gráfico G, hay
- Camino de Euler : un camino que puede atravesar todos los bordes sin repetirlo. Esta propiedad es como dibujar todos los bordes de un trazo sin repetirlo, por lo que algunos de
欧拉路径
los problemas involucrados se llaman一笔画问题
. - Circuito de Euler : un camino que puede atravesar todos los bordes sin repetirlo y volver al punto de partida. Se puede observar que
欧拉回路
demasiado欧拉路径
. - Diagrama de semi-Euler : diagrama que existe en el diagrama
欧拉路径
. - Diagrama de Euler : diagrama que existe en el diagrama
欧拉回路
. Se puede observar que欧拉图
demasiado半欧拉图
.
Figura y conclusión de la trayectoria de Euler y el circuito de Euler
La condición conectada 无向图
es el diagrama (semi) de Euler :
- Si el grado de todos los vértices es par, se puede encontrar desde cualquier vértice
欧拉回路
. Lo contrario también es cierto, es decir, si se puede encontrar un punto de partida desde cualquier vértice欧拉回路
, el grado de todos los vértices es par. - Si hay y solo dos vértices con grados impares, solo se pueden encontrar
欧拉路径
(la ruta comienza en cualquier vértice de los dos puntos y termina en el otro vértice). Lo opuesto también es cierto.
La condición conectada 有向图
es el diagrama (semi) de Euler :
- Si el grado de entrada de todos los vértices es igual al grado de salida, entonces se puede encontrar el punto de partida desde cualquier vértice
欧拉回路
. Lo opuesto también es cierto. - Si hay y solo dos vértices, el grado de entrada no es igual al grado de salida y el grado de entrada de uno de los vértices es mayor que el grado de salida en 1, que se registra como V 1 V_1V1, El grado de entrada del otro vértice es 1 menos que el grado de salida, denotado como V 2 V_2V2, Solo puedes encontrar
欧拉路径
(la ruta desde el vértice V 2 V_2V2Salida al vértice V 1 V_1V1Fin). Lo opuesto también es cierto.
Conectado 混合图
es la condición del gráfico (semi) de Euler : (se 混合图
refiere a un gráfico con bordes tanto dirigidos como no dirigidos).
- Encuentre una estrategia para orientar cada borde no dirigido de modo que el grado de entrada de cada vértice sea igual al grado de salida, de modo que pueda convertirse en un gráfico dirigido. (
这个有待考究
)
Algoritmo de Hierholzer
Breve descripción del problema : Dado un diagrama (semi) de Euler, encuentre la ruta de Euler.
Idea del algoritmo de Hierholzer : cuando un gráfico dado debe tener 欧拉路径(回路
), partiendo de un 合理的
punto de partida (lo que se dirá más adelante es razonable), el recorrido en profundidad de todo el gráfico, los vértices recorridos no deben volver a recorrerse, hasta que se encuentren por primera vez. un 没有可遍历的邻居
vértice, este punto de vértice es el final de una tira de Euler camino a la parte superior "eliminar" (sin eliminar realmente, al que se accede marcando el borde ya no se puede acceder a él), el próximo 没有可遍历的邻居
vértice de encuentro , Debe ser el penúltimo vértice de este camino de Euler, y luego "eliminar" este vértice y volver a atravesar, y así sucesivamente, hasta encontrar todos 没有可遍历的邻居
los vértices, hemos encontrado todos los vértices en este camino de Euler. :
Pregunta 1 : Algunas personas pueden preguntarse por qué el algoritmo de Hierholzer debe poder obtener la ruta de Euler. ¿Por qué cada 没有可遍历的邻居
vértice encontrado es un punto final en el camino de Euler? 下面以有向图作为说明,无向图同理。
En realidad, esto implica el grado de entrada y salida de un vértice.
Si el recorrido comienza desde un cierto vértice, el borde atravesado no se puede atravesar hasta que no haya ningún borde que atravesar. Cuando otro grado de salida es igual al vértice de grado de entrada VVCuando V , es imposible permanecer enVVV , porqueVVV de grado es igual a en grado.入
Cuantas vecesingrese, debe haber un lado externo correspondiente para que出
pueda ir.
Por lo tanto, el primer没有可遍历的邻居
vérticeencontrado essolo de dos tipos, uno es que su grado de entrada es uno mayor que su grado de salida, y el otro es que su grado de entrada y el grado de salida son iguales, pero es el punto de partida (es decir, es tanto un punto de partida como un Es el final, reserva una vuelta). De acuerdo con algunas de las conclusiones mencionadas anteriormente (las conclusiones delgráfico y la ruta de Euler, circuito de Euler), estos dos puntos son los puntos finales en una determinada ruta de Euler, por lo que cuando nos encontramos con没有可遍历的邻居
los vértices, aunque puede estar seguro y en negrita Este vértice se registra porque debe ser el final del camino de Euler.
Pregunta 2: Algunas personas pueden preguntarse por qué el segundo没有可遍历的邻居
vérticeencontrado es elpenúltimo punto del camino de Euler. Podemos imaginar que después de没有可遍历的邻居
"eliminar"el primervértice y el borde correspondiente (en realidad, no es necesario eliminarlo, solo marque que se ha visitado), el grado de salida y el grado de sus vértices adyacentes sucederán Cambie, dibuje en el papel de borrador y encontrará que los vértices a su alrededor se convierten en vértices con grado de salida igual a grado de entrada, o vértices con grado de entrada mayor que grado de salida en 1, y todos se ajustan al punto final de la ruta de Euler. Condición, y debido a que somos un recorrido de profundidad primero de forma recursiva, después de volver de forma recursiva a la capa anterior, debe estar entre estos vértices adyacentes, por lo que el segundo没有可遍历的邻居
vérticeencontrado en este momentodebe ser el penúltimo camino de Euler punto.
Proceso del algoritmo de Hierholzer :
- Elija uno
合理的点
como punto de partida y atraviese todos los bordes adyacentes. (Diré lo que es合理的点
) - Primero busque en profundidad, visite los vértices adyacentes. Los lados que pasarán ya no se pueden visitar.
- Si el vértice actual no tiene bordes adyacentes, el vértice se coloca al final de la matriz.
- Finalmente, la matriz se emite en orden inverso, que es el circuito de Euler que comienza desde el punto de partida.
Función del algoritmo de Hierholzer : personalmente creo que Hierholzer 算法
es una prueba de que cuando un gráfico determinado debe tener 欧拉路径(回路
), de acuerdo con la Hierholzer 算法
búsqueda sin cerebro en profundidad, definitivamente obtendrá 欧拉路径(回路)
el orden inverso. En cuanto a si la obtienes 欧拉路径
o no 欧拉环路
, depende de si tu imagen es 欧拉图
fija 半欧拉图
. Si la imagen 欧拉图
es 欧拉环路
, lo que obtienes es , si la imagen es 半欧拉图
, lo que obtienes es 欧拉路径
. ¿Por qué el algoritmo de Hierholzer puede obtener la ruta de Euler? Cual es su principio? Por favor mira aquí .
Nota: Si la imagen no lo es 欧拉图
o no 半欧拉图
, Hierholzer 算法
el resultado obtenido al usarla debe ser incorrecto. Por lo tanto, antes de adoptarlo precipitadamente Hierholzer 算法
, debemos juzgar si el gráfico está al final de acuerdo con las conclusiones del gráfico y la ruta de Euler y el circuito de Euler mencionados anteriormente . (半)欧拉图
Si es así , entonces podemos usar este algoritmo para encontrarlo 欧拉路径(回路)
.
¿Cuál es el 合理的
punto de partida ? La elección mencionada anteriormente 合理的点
como punto de partida, entonces, ¿cuál es el punto 合理的
? Aquí necesitamos revisar la relación entre el gráfico mencionado anteriormente y la ruta de Euler y el circuito de Euler . Tome el gráfico no dirigido como ejemplo (lo mismo es cierto para los gráficos dirigidos):
- Cuando la imagen es un diagrama de Euler, puede encontrar un punto de partida desde cualquier punto
欧拉回路
. En este momento, comenzando desde cualquier punto, puede encontrar el circuito de Euler, por lo que cualquier punto es合理的
; - Cuando el gráfico es un gráfico semi-euleriano, solo hay dos vértices con grados impares, y solo se pueden encontrar
欧拉路径
(la ruta comienza en cualquiera de estos dos puntos y termina en el otro punto). Tan pronto como partimos, podemos encontrar el camino de Euler, por lo que solo estos dos puntos son合理的
.
Ejemplo : para dominar el algoritmo de Hierholzer, aquí hay un ejemplo [leetcode] 332. La
respuesta a la pregunta de ejemplo de reorganizar el itinerario (C ++) :
// 思路:
// Hierholzer算法。个人觉得Hierholzer算法就是证明了一点:当存在欧拉路径时,从合理的起始点无脑dfs遍历,得到的路径一定是欧拉路径。
// 因为题目规定了一定有欧拉路径,并且起点一定是JFK(所以这个起始点一定是合理的),所以根据Hierholzer算法,可以无脑dfs。
class Solution {
public:
// 这里用map,内部自动按照string升序排列了,所以先找到的一定是自然排序最小的路径
typedef unordered_map<string, map<string, int>> adjacent;
vector<string> min_path;
bool dfs(adjacent &adj, string airport){
// 无脑dfs遍历邻居,同时遍历过的边标记已遍历
for(auto &[next, number] : adj[airport]){
if(0 >= number)
continue;
--number;
dfs(adj, next);
}
// 终点是没有相邻边的点
// 当删除终点后,终点前的点也没有相邻边了,变成新的终点
// 运行到这里,当前airport一定没有可遍历的相邻边了,则它是此时的终点
min_path.push_back(airport);
return true;
}
vector<string> findItinerary(vector<vector<string>>& tickets) {
// 初始化邻接表,因为存在多张相同机票的情况,所以邻接表中还记录了从from到to的机票数
adjacent adj;
for(auto & t : tickets){
if(adj.find(t[0]) == adj.end())
adj[t[0]] = map<string, int>();
if(adj[t[0]].find(t[1]) == adj[t[0]].end())
adj[t[0]][t[1]] = 0;
adj[t[0]][t[1]]++;
}
// Hierholzer算法
dfs(adj, "JFK");
// Hierholzer算法得到结果为终点到起点的路径,需要反转才是题目所要求的结果
std::reverse(min_path.begin(), min_path.end());
return min_path;
}
};
Enlaces relacionados / de referencia
Entrada de "teoría de grafos" y algoritmo de Hierholzer
Euler / ruta [resumen]
sin rutas de Euler, plantilla de bucles (algoritmo de Hierholzer) para mapear