Diagrama de Euler (circuito Euleriano y camino de Euler)

En un gráfico (gráfico dirigido o gráfico no dirigido), si puede pasar todos los bordes a la vez desde un nodo y cada borde solo puede pasar una vez, y puede volver al punto de partida después de pasar todos los bordes, el bucle se llama El circuito de Euler de la figura; si no puede regresar al punto de partida, el camino se llama camino de Euler. La gráfica que contiene el circuito de Euler se llama gráfica de Euler, y la gráfica que contiene la trayectoria de Euler se llama gráfica semieuleriana.

El diagrama de Euler más simple:Inserte la descripción de la imagen aquí


El diagrama de semi-Euler más simple:

Inserte la descripción de la imagen aquí


¿Cómo usar el algoritmo para obtener la ruta de Euler de un gráfico dirigido (similar al algoritmo de gráfico no dirigido)? Veamos la siguiente imagen:


Inserte la descripción de la imagen aquí
Suponiendo que 1 es el punto de partida, la ruta de Euler efectiva es 1–> 3–> 4–> 5–> 3–> 1–> 2; parece que solo necesitamos usar el DFS más común El algoritmo ( haga clic aquí para ver el algoritmo de búsqueda del gráfico DFS ) se puede implementar, pero de hecho, existen ciertas restricciones para salir de una ruta Euler efectiva, cuando estamos en el punto de partida: nodo 1, solo podemos elegir ir al nodo 3. No se puede optar por ir al nodo 2, porque el nodo 2 es un callejón sin salida y no puede atravesar todos los bordes del gráfico, por lo que se puede concluir que debemos prestar atención al callejón sin salida cuando diseñamos el algoritmo para encontrar la ruta de Euler.
Un análisis cuidadoso del camino del camino de Euler podemos encontrar que si una imagen es un diagrama semi-euleriano, hay como máximo un callejón sin salida en esta imagen (un callejón sin salida no puede llegar a otro callejón sin salida), y este callejón sin salida debe ser el último. Entonces podemos diseñar el algoritmo de esta manera (también puede usar este algoritmo para encontrar el bucle de Euler):

Algoritmo de Hierholzer 1: a partir del punto de partida, realice una búsqueda en profundidad mientras mantiene una pila.

2. Cada vez que se mueva de un vértice a otro a lo largo de una arista, debe eliminar esta arista.

3. Si el nodo donde no hay una ruta móvil, agregue el nodo a la pila.

4. Después de colocar todos los nodos en la pila, coloque la pila en la matriz de resultados (invertida), puede obtener esta ruta de Euler)

Ilustración:
Inserte la descripción de la imagen aquí

Código Java:
esta es una solución de problema de código leet, utilizando el algoritmo Hierholzer descrito anteriormente, haga clic aquí para ver el problema

import java.util.*;
//Hierholzer算法
class Solution {
    
    
    //数组list直接代替栈堆,可简化计算,但是使用栈更有利于理解算法
    List<String> list=new ArrayList<>();
    //map用于存储图的信息
    HashMap<String,Queue<String>>map=new HashMap<>();
    public List<String> findItinerary(List<List<String>> tickets) {
    
    
        for(List<String> x:tickets) {
    
    
            String Pos = x.get(0);
            String next = x.get(1);
            if (!map.containsKey(Pos))
                map.put(Pos, new PriorityQueue<>(new Comparator<String>() {
    
    
                    @Override
                    public int compare(String o1, String o2) {
    
    
                        return o1.compareTo(o2);
                    }
                }));
            map.get(Pos).offer(next);
        }
        //开始DFS递归搜索
        DFS("JFK");
        //反转数组,得到欧拉通路的正确顺序
        Collections.reverse(list);
        return list;
    }
    //DFS递归
    private void DFS(String curr){
    
    
        //直到所在结点没有出边时,才跳出while循环,加入数组
        while(map.containsKey(curr)&&map.get(curr).size()>0){
    
    
            String temp=map.get(curr).poll();
            DFS(temp);
        }
        list.add(curr);
    }

}

Supongo que te gusta

Origin blog.csdn.net/CY2333333/article/details/108268034
Recomendado
Clasificación