PUERTA | Puerta TI 2005 | Pregunta 89

Q84 Parte_B
Un sumidero en un grafo dirigido es un vértice i tal que hay una arista desde cada vértice j ≠ i a i y no hay arista desde i a ningún otro vértice. Un grafo dirigido G con n vértices se representa por su array de adyacencia A, donde A[i][j] = 1 si hay una arista dirigida del vértice i al j y 0 en caso contrario. El siguiente algoritmo determina si hay un sumidero en el gráfico G.
i = 0
do {
    j = i + 1;
    while ((j < n) && E1) j++;
    if (j < n) E2;
} while (j < n);

flag = 1;
for (j = 0; j < n; j++)
    if ((j! = i) && E3)
        flag = 0;

if (flag)
    printf("Sink exists");
else
    printf("Sink does not exist");

Elige las expresiones correctas para E3

 
(A) (A[i][j] && !A[j][i])
(B) (!A[i][j] && A[j][i])
(C) (!A[i ][j] | | A[j][i])
(D) (A[i][j] | | !A[j][i])

Respuesta: (D)
Explicación: La siguiente explicación es para la parte anterior de esta pregunta:
para que el vértice i sea un sumidero, no debe haber ningún borde desde i hacia ningún otro vértice.

sink

De acuerdo con la entrada dada en cuestión,

A[i][j] = 1 means there is an edge from vertex i to j.
A[i][j] = 0 means there is no edge from i to j

Para que un Node de i se sumidero,

A[i][j] should be 0 for all j 
A[j][i] should be 1 for all j.

El pseudocódigo anterior verifica cada vértice i en busca de sumidero, comenzando desde i = 0. Básicamente verifica cada vértice j después de i para ver si es un sumidero. El truco del pseudocódigo es que no busca j más pequeño que i. Es posible que el i seleccionado por este bucle no se sumide. Básicamente se asegura de que no ignoremos un sumidero potencial. La comprobación de si i es realmente un sumidero o no se realiza más tarde después del ciclo do while.

El vértice i es un sumidero potencial mientras que A[i][j] es cero
Por lo tanto, E1 : !A[i][j]

Si la condición anterior es falsa, entonces i no es un sumidero. Todo j < i tampoco puede ser un sumidero porque no hay un borde de i a j.
Ahora, el próximo sumidero potencial puede ser j.
Entonces, E2 : i = j

Explicación de esta pregunta
El siguiente pseudocódigo básicamente verifica si el sumidero potencial seleccionado por el código anterior es realmente un sumidero o no.

flag = 1;
for (j = 0; j < n; j++)
    if ((j! = i) && E3)
        flag = 0;

la bandera es igual a 0 significa que no es un sumidero. El código establece la bandera 0 tan pronto como descubre que i no es un sumidero.

A node i is not a sink if either of the following 
two conditions become true for any j not equal to i.
A[i][j] is 1 for any j 
OR
A[j][i] is 0 for any j

E3 : (A[i][j] | | !A[j][i])

Por lo tanto, la opción D es correcta

Cuestionario de esta pregunta

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *