📜  门| Gate IT 2005 |第89章

📅  最后修改于: 2021-06-28 17:44:26             🧑  作者: Mango

Q84 Part_B
有向图中的汇点是一个顶点i,因此从每个顶点j≠i到i都有一条边,并且从i到任何其他顶点都没有边。具有n个顶点的有向图G由其邻接矩阵A表示,如果存在从顶点i指向j的边,则A [i] [j] = 1,否则为0。以下算法确定图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");

为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])

答案: (D)
说明:以下说明适用于该问题的上一部分:
对于要成为顶点的汇点,从i到任何其他顶点都不应有边。

下沉

根据有问题的输入,

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

为了使我沉没的一个节点,

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

上面的伪代码从i = 0开始检查每个顶点i是否有宿。它基本上检查i之后的每个顶点j是否有宿。伪代码的诀窍是,它不会检查j小于i的情况。该循环选择的i可能不会下沉。基本上可以确保我们不会忽略潜在的沉没。在do while循环之后,稍后检查i是否实际上是一个接收器。

顶点i是一个潜在的吸收点,而A [i] [j]为零
因此, E1:!A [i] [j]

如果以上条件为假,那么我就不是一个接收器。所有j 现在,下一个潜在的下沉可以是j。
因此, E2:i = j

这个问题的解释
以下伪代码基本上检查上面代码选择的潜在接收器是否实际上是接收器。

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

标志等于0表示我不是一个接收器。一旦发现我不是接收器,该代码会将标志设置为0。

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])

因此选项D是正确的这个问题的测验