スポンサーリンク

隣接リスト

隣接リスト

今回は、上記の経路(有向グラフ)を、隣接リストで表現します。

#define ROW 6
#define COL 3

int pathList[ROW][COL] = {
	{0},
	{2, 3, 0},
	{4, 0},
	{6, 0},
	{5, 0},
	{0}
};

スポンサーリンク

深さ優先探索

深さ優先探索は、行き止まりに到達するまで、先に先に経路を進めるイメージです。
再起を使うとシンプルに書けてしまいます。

dfs()の引数で、スタート地点とゴール地点を設定します。
通過した地点は、配列route[地点]の要素に1を代入します。
ゴール地点まで到達したら、Found targetと表示します。
あとは、次の地点の経路をdfs()の引数に設定して、dfs()自身を再帰呼び出しします。

void dfs(int start, int target){
	int i;
	
	route[start] = 1;
	printf("%d→", start);
	if(start == target){
		printf("Found target");
		return;
	}
	for(i = 0; pathList[start][i] != 0; i++){
		if(route[pathList[start][i]] == 0){
			dfs(pathList[start][i], target);
		}
	}
}

サンプルコード

下記がサンプルコードになります。

 $ cat sample.c 
#include 
#define ROW 6
#define COL 3

int pathList[ROW][COL] = {
	{0},
	{2, 3, 0},
	{4, 0},
	{6, 0},
	{5, 0},
	{0}
};

int route[ROW];

void initRoute(){
	int i;
	for(i = 0; i < ROW; i++){
		route[i] = 0;
	}
	
	return;
}

void dfs(int start, int target){
	int i;
	
	route[start] = 1;
	printf("%d→", start);
	if(start == target){
		printf("Found target");
		return;
	}
	for(i = 0; pathList[start][i] != 0; i++){
		if(route[pathList[start][i]] == 0){
			dfs(pathList[start][i], target);
		}
	}
}

int main(){
	initRoute();
	dfs(1, 6);
		
	return 0;
}

下記が実行結果になります。
 $ gcc -o sample sample.c
 $ ./sample 
1→2→4→5→3→6→Found target

スポンサーリンク