/*********************************************************** dfs.c -- 縦形探索 ***********************************************************/ Declare Function printf CDECL Lib"msvcrt" (fmt As *Byte, ...) As Long
#console const NMAX =100 /* 点の数の上限 */ Dim adjacent[NMAX, NMAX] As Byte /* 隣接行列 */
Dim n As Long n=7 /* 点の数 (例) */ Dim data[ELM(10)] = [ 1, 2, 2, 3, 1, 3, 2, 4, 5, 7 ] As Long /* データ (例) */
Dim visited[NMAX] As Byte /* 訪れたなら1 */
Function Cnot(i As Long) As Long If i Then Cnot = 0 Else Cnot = 1 End If
End Function
Sub readgraph() /* グラフ入力 */ Dim i As Long, j As Long, k As Long
For i=1 To n For j=1 To n adjacent[i,j] = 0 Next Next
For k=0 To 9 If (k mod 2) = 0 Then i = data[k] Else j = data[k] adjacent[i,j] = 1 adjacent[j,i] = 1 End If Next printf(Ex"隣接行列:\n") For i=1 To n For j=1 To n printf(Ex" %d", adjacent[i,j]) Next printf(Ex"\n") Next End Sub
Sub visit(i As Long) /* 点 i を訪れる (再帰的) */ Dim j As Long
printf(Ex" %d", i) visited[i] = 1 For j=1 To n If adjacent[i,j] And Cnot(visited[j]) Then visit(j) Next End Sub
Sub main() Dim i As Long, count As Long
readgraph() /* グラフのデータを読む */ For i=1 To n visited[i] = 0 /* まだどこも訪れていない */ Next printf(Ex"連結成分:\n") count = 0 For i=1 To n /* 連結成分を数える */ If Cnot(visited[i]) Then count = count + 1 printf(Ex"%3d:", count) visit(i) printf(Ex"\n") End If Next End Sub main()