Nombre de sommets accessibles en DAG pour chaque sommet

11

Soit un graphe dirigé acyclique, tel que le degré extérieur de tout sommet soit . Pour chaque sommet de nous pouvons compter le nombre de sommets accessibles, simplement en exécutant dfs à partir de chaque sommet et cela prendra du temps . Existe-t-il une meilleure façon de résoudre ce problème?O ( log | V | ) GG(V,E)O(log|V|)GO(|V||E|)

MikleB
la source
1
@Radu est-ce un double direct? ça sonne comme ça
Suresh Venkat
@Suresh, par rapport à ma question, celui-ci a une limite supérieure sur le degré du sommet et ne demande pas de limites inférieures. Ce sont de petites différences à mon avis, donc je le considérerais comme un doublon, mais je n'y pense pas beaucoup.
Radu GRIGore
1
ok donc nous allons le laisser tel quel.
Suresh Venkat
4
La réponse de virgi à ma question implique un algorithme pour celui-ci. O(|V|2)
Radu GRIGore

Réponses:

5

Le meilleur algorithme exact s'exécutera dans le temps O (min {mn, n ^ 2,38}) en utilisant une multiplication matricielle binaire rapide. Cependant, il existe un algorithme aléatoire, qui s'exécute dans le temps O (m + n) et estime le nombre de nœuds accessibles à partir de chaque nœud avec une petite erreur relative, veuillez vous reporter à l'article " Cadre d'estimation de la taille avec des applications à la fermeture et à l'accessibilité transitives" "par Edith Cohen.

user22547
la source
-1

Je ne suis pas un expert ici je vais essayer.

1) Puisqu'il s'agit de DAG, il devrait avoir un sommet de puits, c'est-à-dire un sommet avec un degré 0. Trouver un sommet de puits dire x et ajouter {x} comme sommet accessible au voisin (x). supprimer x et répéter le processus jusqu'à ce que le graphique devienne vide

Prabu
la source
Étant donné que le degré extérieur est limité, il semblerait plus utile de commencer par une source?
András Salamon
@ andras-salamon: non, car vous ne savez pas combien de nœuds sont accessibles depuis une source. Mais vous ne faites pas ça (zéro) pour un évier.
Martin
Le temps d'exécution de cet algorithme est également - donc pas mieux que ce qui a été décrit dans la question. À chaque étape, le sommet que vous envisagez peut avoir un ensemble de sommets accessibles; vous ajoutez cela à chacun de ses voisins, ce qui prend temps par voisin. Au total, vous effectuez travail par arête, pour un total de travail. O(|V||E|)xO(|V|)O(|V|)O(|V|)O(|V||E|)
DW
-2

(Similaire à la solution de Prabu ... mais plus détaillée)

Soit les voisins (sortants) de et dénote le nombre de sommets accessibles depuis v.N(v)vreach(v)

  1. faire un tri topologique. (possible en )O(|V|+|E|)
  2. à partir de la fin de la liste (à l'extrémité d'un puits): Pour chaque sommet (à partir de l'extrémité de la liste): .r e a c h ( v ) = n N ( v ) r e a c h ( n )vreach(v)=nN(v)reach(n)

La deuxième partie traverse chaque arête une fois, en ajoutant une autre, donc au total je reçois .O ( | V | + ||E|O(|V|+|E|)

Martin B.
la source