[Teoría de grafos] ¿Qué es el diagrama de Euler? ¿Cómo encontrar el camino de Euler?

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 :

  1. 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.
  2. 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 :

  1. 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.
  2. 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).

  1. 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 quepueda 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

Supongo que te gusta

Origin blog.csdn.net/a435262767/article/details/105253850
Recomendado
Clasificación