Q84 Part_A
有向图中的汇点是一个顶点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");
为E 1和E 2选择正确的表达式
(A) E1:A [i] [j]和E2:i = j;
(B) E1:!A [i] [j]和E2:i = j + 1;
(C) E1:!A [i] [j]和E2:i = j;
(D) E1:A [i] [j]和E2:i = j + 1;答案: (C)
说明:要使顶点i成为汇点,从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
因此,选项(C)是正确的。
这个问题的测验