1. 程式人生 > >C語言用DFS實現找到圖的所有路徑(鄰接矩陣實現)

C語言用DFS實現找到圖的所有路徑(鄰接矩陣實現)

以下是例子,所有圖的DFS遍歷,只需要修改createGraphics()函式即可,即生成自己的map(鄰接矩陣),就可以找到兩個點之間所有的路徑。

1.問題如下:

輸入一個矩陣的行數r(5-10)與列數c(5-10),生成一個無向圖,該圖每行有c個頂點每列有r個頂點,相鄰頂點間有邊連線,邊的權值均為1,對該圖的頂點進行編號,分別為1,2,...,r*c,用DFS找到某兩個點之間的所有路徑。

及類似如下的圖:(只是簡單的改變行和列)

2.程式碼如下

#include<stdio.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>

int map[100][100];
int row, column;

int i, j;
int pathOrder = 0;  //記錄到當前找到的路徑個數 
int startPoint, endPoint;
int path[100], visited[100] = { 0 };
int pathNumber = 0;

//
//初始化連線矩陣 
// 
void createGraphics()
{
	int tmp[4][2] = { {0,1},{1,0},{-1,0},{0,-1} };
	memset(map, 0, sizeof(map));
	for (i = 0; i < row*column; i++)
	{
		//找到該點上下左右4個點初始map 
		int r = i / column;
		int c = i % column;
		for (j = 0; j < 4; j++)
		{
			//(r,c)相鄰的點為(r1,c1) 
			int r1 = r + tmp[j][0];
			int c1 = c + tmp[j][1];
			if (r1 >= 0 && r1 < row&&c1 >= 0 && c1 < column)
			{
				map[i][r1*column + c1] = 1;
			}
		}
	}
}


//
//返回第n個節點相連線序號最小的節點 
//
int first(int n)
{
	for (i = 0; i < row*column; i++)
	{
		if (map[n][i] == 1)
			return i;
	}
	printf("起點為故障點,請輸入一個不為故障點的起點\n");
	return 0;
}


//
//返回第n個節點相鄰的點的個數
// 
int sumCount(int n)
{
	int count = 0;
	for (i = 0; i < row*column; i++)
	{
		if (map[n][i] == 1)
			count++;
	}
	return count;
}


//
//返回第n個節點相連的比now節點序號大的節點,
//
int next(int n, int now)
{
	for (i = now + 1; i < row*column; i++)
	{
		if (map[n][i] == 1)
			return i;
	}
	return 1000;  //當找不到節點n的下一個節點,返回1000
}


//
//DFS尋找所有路徑 
//count為從起點到當前節點經過的節點數,pathNumber為尋找到的路徑條數 
void DFS(int nowPoint, int count)
{
	visited[nowPoint] = 1;
	path[count++] = nowPoint;
	if (nowPoint == endPoint && (count) >= 1)
	{
		pathNumber++;
		printf("這兩個城市間第%d條簡單路徑為: ", pathNumber);
		for (i = 0; i < (count)-1; i++)
		{
			printf("%d-->", path[i] + 1);
		}
		printf("%d\n", path[(count)-1] + 1);
	}
	else
	{
		int k;
		for (k = first(nowPoint); k < row*column; k = next(nowPoint, k))
		{
			if (visited[k] == 0)
				DFS(k, count);
		}
	}
	visited[nowPoint] = 0;  //演算法關鍵,回溯,將訪問過狀態變為未訪問狀態 
	(count)--;
	return;
}


int main()
{
	int count = 0, pathNumber = 0;
	printf("請輸入要生成圖的行和列:");
	scanf("%d%d", &row, &column);
	createGraphics();
	printf("請輸入要找到路徑的起點和終點:");
	scanf("%d%d", &startPoint, &endPoint);
	startPoint--;
	endPoint--;
	DFS(startPoint, count);
	system("pause");
	return 0;
}





3、結果如下: