Considere gráficos dirigidos. Llamamos a un nodo superestrella si y solo si no se puede alcanzar a otro nodo desde él, pero todos los demás nodos tienen una ventaja para . Formalmente:
v
con el número de nodos en el gráfico. Por ejemplo, en el gráfico a continuación, el nodo sin llenar es una superestrella (y los otros nodos no lo son).
[ fuente ]
¿Cómo puede identificar todas las superestrellas en gráficos dirigidos en tiempo ? Se puede elegir una representación gráfica adecuada de los candidatos habituales ; absténgase de utilizar representaciones que trasladen la complejidad del problema al preprocesamiento.
No se pueden hacer suposiciones con respecto a la densidad. No asumimos que el gráfico contiene una superestrella; Si no hay ninguno, el algoritmo debería reconocerlo.
Notación : es el número de bordes salientes de un nodo, similar para los bordes entrantes.
fuente
Respuestas:
Podemos eliminar todos los vértices menos uno verificando la existencia de aristas porque podemos eliminar una posibilidad para cada arista que verificamos. En particular, si hay un borde que va de x a y , eliminamos x y avanzamos hacia y (ya que se puede alcanzar otro vértice desde él); si no, eliminamos y (ya que no se puede alcanzar desde x ). Una vez que alcanzamos el último vértice, el vértice que no se elimine debe compararse entre sí (asegúrese de que se cumpla la condición de superestrella: hay un borde entrante pero no saliente) hasta que se elimine o confirme como superestrella. Algunos pseudocódigo:n−1 x y x y y x
Veamos un ejemplo para ilustrar el método. Tome esta matriz, con el vértice de origen en la parte superior y el destino al lado. 1 indica un borde:
Eliminaré los vértices que hemos descartado como posibles superestrellas. Usaré verde y rojo para indicar los bordes que estamos viendo cuando lo hacen y no contienen el borde que estamos buscando, y azul para indicar dónde ya hemos buscado.
Comenzamos mirando los vértices 1 y 2.
El número verde muestra que hay un borde de 2 a 1, por lo que eliminamos 2 y buscamos un borde de 3 a 1 :
Vemos que no existe tal borde, por lo que eliminamos 1 y tomamos 3 como nuestro vértice actual. Recuerde que ya hemos eliminado 2, así que vea si hay una ventaja de 4 a 3:
Hay un borde de 4 a 3, por lo que eliminamos 4. En este punto, hemos eliminado todos menos uno de los vértices (3), así que revise sus bordes y vea si califica:
Hay una ventaja de 1 a 3 pero no la inversa, por lo que 3 sigue siendo un candidato.
También hay una ventaja de 2 a 3, pero no al revés, por lo que 3 sigue siendo un candidato.
Hay una ventaja de 4 a 3 pero no de 3 a 4; eso completa nuestra comprobación de los bordes de 3 y hemos descubierto que, de hecho, es una superestrella.
fuente
¿No es este el problema de las celebridades ?
Solo habrá una superestrella (celebridad) si hay una.
Utilizamos la representación de matriz de adyacencia, dondeA [ i , j ] = 1 si hay un borde dirigido desde yo a j de lo contrario es 0 0 . (Supongo que está permitido).
Al mirarA [ i , j ] (se puede hacer en O (1) tiempo) podemos eliminar al menos uno de ellos como candidato para ser la celebridad: si A [ i , j ] = 1 , entonces puedes eliminar yo . SiA [ i , j ] = 0 podemos eliminar j .
Mantener una lista de candidatos actuales, eliminando uno por uno. Una lista vinculada debería ser suficiente.
Al final, puede verificar si su candidato es realmente una superestrella.
Este algoritmo seráO ( n ) .
fuente
Esta respuesta aborda la versión de la pregunta donde era posible cualquier representación gráfica, no la versión actual de la pregunta.
Almacene su gráfico como un par de lista de adyacencia y lista de adyacencia inversa, donde cada lista contiene además la longitud de la lista, por lo tanto, el número fuera y dentro de los bordes, respectivamente.
Preprocesamiento: calcular la lista de adyacencia inversa (es decir, la lista de bordes). CostoO ( | EEl | ) .
Recorre las listas y selecciona cualquier nodo donde esté el número de bordes externos0 0 y el número de bordes es n - 1 . CostoO ( | NEl | ) .
fuente
Solo como referencia, este es un seudocódigo de una versión recursiva de lo que Kevin publicó.
fuente