グラフでのシンク検出に関する Pascal への実装があります。コードは次のとおりです。
FUNCTION KATAVOTHRA (A:MATRIX; N:INTEGER): INTEGER;
VAR
I,J,K,S:INTEGER;
BEGIN
KATAVOTHRA:=0;
I:=1;
WHILE (KATAVOTHRA=0 AND I<N) DO {1}
BEGIN
J:=1;
WHILE (A[I,J]=0 AND J<N) DO J:=J+1; {2}
IF (J=N) THEN BEGIN
S:=0;
FOR K:=1 TO N DO S:=S+A[K,I];
IF (S=N-1) THEN
KATAVOTHRA:=1;
END;
I:=I+1;
END;
END;
次の隣接行列があると仮定します。
0 0 1
1 0 1
0 0 0
V1
、V2
およびV3
頂点用。(2 つのノード間に接続がある場合は 1 コード、それ以外の場合はゼロ コード)。
この入力でコードをトレースしようとしていますが、できません。その理由は、私が 3 のときに結果を取得しないためです。これまでに行ったことを見てみましょう: (KATAVOTHRA
はシンクの名前です)。
BEGIN with I:=1; and J:=1
(最初の while ループの内側)
最初にA[1,1]
がゼロかどうかを確認し、それが (続行するために 1 < 3 もちろん) であることを確認します。J= J+1 => J=2
A[1,2]
もゼロなので、J を再度インクリメントすると、J は 3 になります。3 は 3 未満でA[1,3]
はなく、0 ではありません。したがって、IF ステートメントにIF( J = N) => IF( 3 = 3 ) then S=0 (sum)
進むので、FOR ループに進み、要約します。A[1,1] + A[2,1] + A[3,1]
IF( S = N-1) THEN
私たちはシンクを見つけました。しかし、ここでは 2 ではありS=1
ません。FOR ループから出ます。私は今 2 になります。再びWHILE(KATAVOTHRA=0 AND 2<3)
J は 1 です。今チェックしてA[2,1]
いますが、ゼロではなく、2 は 3 ではありません。しかし、今回は 3 < 3 は偽なので、ループ全体がそこで終了しますか? 理解できません(パスカル言語の経験はあまりありませんが)。
これの何が問題なのですか?