J'ai un arbre non orienté dont je veux étiqueter les sommets. Les nœuds foliaires doivent être étiquetés un. Supposez ensuite que les feuilles ont été retirées. Dans l'arbre qui reste, les feuilles doivent être étiquetées deux. Ce processus se poursuit de manière évidente jusqu'à ce que tous les sommets aient une étiquette. La raison pour laquelle je fais cela est que je veux stocker les sommets dans une file d'attente et les parcourir "laisse d'abord". Existe-t-il un moyen facile de faire ce temps ?
Je peux résoudre le problème en faisant un BFS à chaque étape. Mais dans le pire des cas, à chaque étape, je passe par chaque sommet, j'enlève exactement deux feuilles et je les mets en file d'attente. Je crois que cela prend du temps quadratique.
Une autre idée était de trouver d'abord toutes les feuilles, puis de faire un BFS à partir de chaque feuille. Cela ne me donne pas la solution souhaitée. Par exemple, considérez une sorte de "graphique de couronne" comme dans la figure ci-dessous. La solution souhaitée est indiquée, mais le lancement d'un BFS à partir de chaque feuille entraînerait l'utilisation de seulement deux étiquettes.
Idéalement, l'algorithme de temps linéaire serait également facile à expliquer et à mettre en œuvre.
la source
Une réponse simple est la suivante:
Transformez cela en un graphique dirigé, où nous avons une arête de chaque nœud à son parent . Notez que vous obtenez un dag (graphique acyclique dirigé).u v(u,v) u v
Tri topologique du graphique.
Scannez les sommets, dans l'ordre trié. Étiquetez chaque sommet avec une de plus que la plus grande des étiquettes de ses prédécesseurs. Puisque nous numérisons dans l'ordre topologique, tous les prédécesseurs de auront déjà reçu une étiquette avant d'essayer d'étiqueter .vv v
Chacune de ces étapes peut être effectuée en temps , de sorte que le temps de fonctionnement total est . Je ne mentionne cette approche alternative que si vous la trouvez conceptuellement plus facile à comprendre que la réponse de Yuval.O ( n + m )O(n+m) O(n+m)
la source