Dado un gráfico acíclico dirigido , un vértice es una fuente si su grado es cero, lo que significa que solo tiene arcos salientes.
¿Existe un algoritmo de tiempo lineal para encontrar una fuente en un gráfico acíclico dirigido dado?
Pregunta de seguimiento: ¿Puede uno en tiempo lineal encontrar todas las fuentes?
algorithms
graph-theory
breezeintopl
fuente
fuente
Respuestas:
Como menciona Yuval, la estructura de datos es importante aquí. Trataré de dar una solución para algunos de los tipos de listas de adyacencia:
Como nota al margen, si elegir la estructura de datos está en sus manos, es posible que desee analizar qué operaciones pretende realizar y con qué frecuencia, y elegir una estructura de datos adecuada.
Editar: para el caso 1, si tiene un dag donde el número de fuentes es muy pequeño en comparación conEl | VEl | (por ejemplo, en un árbol con una fuente), y donde la distancia promedio desde cualquier vértice a una fuente es pequeña en comparación conEl | VEl | y solo desea una fuente única, puede usar un algoritmo más rápido en promedio (aunque la peor complejidad asintótica será la misma). Seleccione cualquier vértice al azar, y vaya a cualquiera de sus padres (de la lista de borde entrante), y luego a su padre y así sucesivamente, hasta llegar a un nodo que no tiene padre - una fuente. Esta pequeña ganancia de eficiencia es para tipos muy limitados de gráficos con un algoritmo un poco más complejo.
fuente
Consideremos una pregunta más simple. Suponga que sabe que su gráfica es un árbol. Luego puede encontrar el nodo fuente en tiempo lineal. Simplemente seleccione un nodo aleatorio, si es la raíz, entonces tiene su respuesta, si no debe ser un niño o un padre, retroceda hasta llegar a la raíz. Esto se puede hacer enO ( | VEl | -1) .
fuente
Suponiendo que tiene un gráfico G = (V, E) en formato de lista de adyacencia. (para que quede claro aquí, la lista contiene todos los bordes salientes de la fuente). Puedes construir el inverso del gráfico G en tiempo lineal. Luego puede iterar sobre el gráfico inverso y recopilar todos los vértices que tienen una lista de adyacencia vacía. Estos vértices no tienen borde saliente en el gráfico inverso, lo que significa que no tienen bordes entrantes en el gráfico original, por lo tanto, estos son sus vértices de origen.
El tiempo de ejecución es lineal. La construcción de la inversa del gráfico requiere un tiempo máximo de O (| V | + | E |). Iterar sobre el inverso del gráfico toma tiempo O (| V |).
fuente