Graphe non-dirigé la conversion de l'arbre
Donné un graphes non orientés dans lequel chaque nœud a un de coordonnées Cartésiennes dans l'espace, qui a la forme générale d'un arbre, est-il un algorithme pour convertir le graphique dans un arbre, et trouver le nœud racine?
De noter que notre définition d'un "arbre", exige que les branches ne divergent pas de nœuds parents à des angles aigus.
Voir l'exemple dans les graphiques ci-dessous. Comment pouvons-nous trouver le rouge noeud?
Dans cet exemple de graphes non orientés, tout nœud pourrait être considéré comme la racine, et vous obtenez un bon arbre. Si j'ai bien compris, le nœud qui sera la racine dépend de la disposition spatiale des nœuds. Mais il n'est pas clair pour moi, et ce que vous entendez par "branches ne divergent pas de nœuds parents à des angles aigus". Pouvez-vous préciser? Pouvez-vous expliquer par exemple pourquoi le plus haut ou le plus à droite du nœud ne peut pas être une racine pour votre application?
voulez-vous dire que les angles entre les branches reliant les frères et sœurs et leur (commun) nœud parent ne doit pas être aiguë ? avez-vous une structure de données pour des travaux au-delà de coordonnées et de la structure graphique ? outre le degré du nœud racine, vos arbres binaires ? arbres binaires serait plus facile à traiter que exactement 1 des 3 angles entre les bords adjacents est aiguë, de sorte que le parent/enfant-relations pourraient être déterminés localement.
notez que votre problème semble être mal définie: examiner toute steiner arbre; il y a n des angles aigus entre les branches. par conséquent, un nœud peut être choisi comme un nœud racine, sans violer votre contrainte
ne peut pas à chaque nœud être la racine d'un arbre en fonction de la façon dont vous regardez le graphique?
voulez-vous dire que les angles entre les branches reliant les frères et sœurs et leur (commun) nœud parent ne doit pas être aiguë ? avez-vous une structure de données pour des travaux au-delà de coordonnées et de la structure graphique ? outre le degré du nœud racine, vos arbres binaires ? arbres binaires serait plus facile à traiter que exactement 1 des 3 angles entre les bords adjacents est aiguë, de sorte que le parent/enfant-relations pourraient être déterminés localement.
notez que votre problème semble être mal définie: examiner toute steiner arbre; il y a n des angles aigus entre les branches. par conséquent, un nœud peut être choisi comme un nœud racine, sans violer votre contrainte
ne peut pas à chaque nœud être la racine d'un arbre en fonction de la façon dont vous regardez le graphique?
OriginalL'auteur paniwani | 2011-11-06
Vous devez vous connecter pour publier un commentaire.
voici une suggestion sur la façon de résoudre votre problème.
conditions préalables
g
graphique,g.v
graphe de sommetsv,w,z
: sommetse
: edge individueln
: nombre de sommetsidée
g
par les orientations de l'arbre implicite parg
et la encore-à-être-trouvé nœud racine par des calculs locaux sur les nœuds deg
.v -> w
:v
enfant,w
parent).algorithme
assume la représentation standard de la graphique de l'arborescence de la structure (par exemple la liste d'adjacence)
g.v
sont marqués d'abord comme pas de visites, pas fini.visiter tous les sommets de suite arbitraire. ignorer les nœuds marqués comme "fini".
laissez
v
être actuellement sommet visité.v
des aiguilles d'une montre en commençant par un choisi au hasarde_0
dans l'ordre des bords de l'angle avece_0
.2.2. orienter les arêtes adjacentes
e_1=(v,w_1), e_2(v,w_2)
, qui entourent un angle aigu.adjacent: wrt être commandés en fonction de l'angle qu'ils renferment avec
e_0
.[ note: l'existence de cette paire n'est pas garanti, voir 2ème commentaire et dernière remarque. si aucun angle est aigu, passez au point 2. avec le nœud suivant. ]
2.2.1 les orientations des arêtes
e_1, e_2
sont connus:w_1 -> v -> w_2
: impossible, comme un grand-parent-enfant-segment englobe un angle aiguw_1 <- v <- w_2
: impossible, même raisonw_1 <- v -> w_2
: impossible, il n'y a pas de nœuds avec outdegree >1 dans un arbrew_1 -> v <- w_2
:seule paire possible d'orientations.
e_1, e_2
pourrait avoir été orienté avant. si l'orientation précédente viole l'affectation actuelle, le problème de l'instance n'a pas de solution.2.2.2 cette mission implique une structure arborescente sur le sousgraphes induite par tous les sommets accessibles depuis
w_1
(w_2
) sur un chemin ne comprenant pas dee_1 (
e_2`). marquer tous les sommets dans les deux induite par les sous-arbres finis[ note: la sous-arborescence de la structure peut violer l'angle des contraintes. dans ce cas, le problème n'a pas de solution. ]
2.3 marque
v
visité. après avoir terminé les étapes 2.2 au sommetv
, de vérifier le nombrenc
des bords de la connexion qui n'ont pas encore été affectés à une orientation.nc = 0
: c'est la racine que vous avez été à la recherche pour - mais vous devez vérifier si la solution est compatible avec vos contraintes.nc = 1
: laissez cette arête être(v,z)
.l'orientation de ce bord est v->z que vous êtes dans un arbre. la marque de v comme fini.
z
si il est marqué terminé.si elle n'est pas, vérifiez le nombre
nc2
de pas orientées arêtes reliantz
.nc2
= 1: répétez l'étape 2.3 en prenantz
pourv
.si vous n'avez pas encore trouvé un nœud racine de votre problème instance est ambiguë:
orienter le reste pas orientées bords.
remarques
résiliation:
chaque nœud est visité au max 4 fois:
exactitude:
complexité (temps):
le balayage des aiguilles d'une montre par le biais de tous les bords de la connexion à un même sommet a besoin de ces bords afin d'être triés.
ainsi, vous devez
O( sum_i=1..m ( k_i * lg k_i ) )
àm <= n
sommets sous la contraintesum_i=1..m k_i = n
.au total cela nécessite
O ( n * lg n)
, commesum_i=1..m ( k_i * lg k_i ) <= n * lg n
donnésum_i=1..m k_i = n
pour toutm <= n
(démontrable par l'application de lagrange d'optimisation).[ note: si vos arbres ont un degré borné par une constante, vous avez théoriquement de tri en temps constant à chaque nœud affecté; grand total dans ce cas:
O(n)
]de la sous-arborescence de marquage:
chaque nœud du graphe est visité au max 2 fois par cette procédure si elles sont appliquées comme un dfs. donc un grand total de
O(n)
pour l'invocation de cette sous-routine.au total:
O(n * lg n)
complexité (de l'espace):
O(n)
de tri (avec un sommet de degré et pas constant lié).problème est probablement mal définis:
OriginalL'auteur collapsar
Une solution simple serait de définir un rectangle 2d autour du nœud rouge ou le centre de votre nœud et de calculer à chaque nœud avec un moore courbe. Moore courbe est une courbe de remplissage d'espace, plus d'une version spéciale d'une courbe de hilbert où le début et la fin de vertex est la même et le système de coordonnées est dans le milieu du rectangle 2d. Dans generell votre problème ressemble à une discrète de l'espace d'adressage problème.
OriginalL'auteur Bytemain