Tengo un árbol no dirigido cuyos vértices quiero etiquetar. Los nodos de la hoja deben etiquetarse como uno. Luego, suponga que las hojas fueron removidas. En el árbol que queda, las hojas deben etiquetarse como dos. Este proceso continúa de la manera obvia hasta que todos los vértices tengan una etiqueta. La razón por la que hago esto es porque quiero almacenar los vértices en una cola y pasar por ellos "las hojas primero". ¿Hay una manera fácil de hacer este tiempo ?
Puedo resolver el problema haciendo un BFS en cada paso. Pero en el peor de los casos, en cada paso que paso por cada vértice, elimino exactamente dos hojas y las pongo en cola. Creo que esto lleva tiempo cuadrático.
Otra idea era encontrar primero todas las hojas y luego hacer un BFS de cada hoja. Esto no me da la solución deseada. Por ejemplo, considere un tipo de "gráfico de corona" como en la figura a continuación. Se muestra la solución deseada, pero el lanzamiento de un BFS desde cada hoja daría como resultado solo dos etiquetas utilizadas.
Idealmente, el algoritmo de tiempo lineal también sería fácil de explicar e implementar.
fuente
Una respuesta directa es la siguiente:
Convierta esto en un gráfico dirigido, donde tengamos una arista desde cada nodo hasta su padre . Tenga en cuenta que obtiene un dag (gráfico acíclico dirigido).(u,v) u v
Topológicamente ordenar el gráfico.
Escanee los vértices, en orden ordenado. Etiquete cada vértice con una más que la mayor de las etiquetas en sus predecesores. Como estamos escaneando en orden topológico, todos los predecesores de ya habrán recibido una etiqueta antes de intentar etiquetar .v v
Cada uno de estos pasos se puede realizar en tiempo , por lo que el tiempo total de ejecución es . Menciono este enfoque alternativo solo en caso de que te resulte conceptualmente más fácil de entender que la respuesta de Yuval.O(n+m) O(n+m)
fuente