有向圖 深搜 (城市地圖 求最短距離)

在這裏插入圖片描述
求出最短距離的方案。

這次也是搭配着矩形圖來解決
在這裏插入圖片描述
在這裏0就是代表自己相同點重合,無窮則代表兩點之間沒有關係,裏面大於0的數字是兩點之間的距離

舉例子
輸入1 2 2 意思就是頂點1指向頂點2 兩點之間距離爲2
輸入4 5 5 意思就是頂點4指向頂點5 兩點之間距離爲5

頂點之間指向方向以及,兩點之間距離等信息放在表中,在利用表中數據來求出

輸入內容
5 8
1 2 2
1 5 10
2 3 3
2 5 7
3 1 4
3 4 4
4 5 5
5 3 3

第一行 第一個5 的意思是創建5*5的表格  第二個8是等下輸入8行
後面8行  就是8組(兩個頂點+距離) 每組第一個指向第二個

代碼

#include <stdio.h>
int min=99999999,book[101],n,e[101][101];

//cur是當前所在的城市編號,dis是當前已經走過的路程 
void dfs(int cur,int dis)
{
	int j;
	//如果當前走過的路已經大於之前找到的最短路了,就可以返回了
	if(dis>min) return;
	if(cur==n)  //判斷是否達到目標
	{
		if(dis<min)
			min = dis;
		return;
	} 
	
	//依次1-n個城市嘗試
	for(j=1;j<=n;j++){
		if(e[cur][j]!=99999999&&book[j]==0)
		{
			book[j]=1; //標記已經訪問了
			dfs(j,dis+e[cur][j]);  //從該城市出發繼續尋找目標
			book[j]=0;   //訪問完要取消訪問 
		} 
	}
	return; 
} 

int main()
{
	int i,j,m,a,b,c;
	scanf("%d%d",&n,&m);
	//初始化二維矩陣
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(i==j) e[i][j]=0;
			else   e[i][j]=99999999;
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		e[a][b] = c;
	}
	//進行標記 book[1]=1
	book[1]=1;
	dfs(1,0);  //從第一個點開始出發,0表示走過的路徑
	printf("%d",min); 
	return 0;
} 

最後運行結果爲:9

整體大概過程

這裏的9999999假設爲無窮,e數組是個二維數組 就是表格用來存放關於頂點之間信息
book數組用來保存是否訪問過該節點

第一步:輸入表格的長度以及下面幾組頂點方向及距離,給表格首先賦全值,後面根據8行再次填充對應表格位置的長度。

第二步:book的首位地址爲1表示已經訪問過了,進入dfs
先看其中for循環,首先第一步訪問第一行數據,根據判斷條件到第二個點滿足,於是先給book數組對應記上已經訪問過
緊接着進行調用自身進入第二組循環,(此時第一組for循環並沒有執行完),在第二組循環中找到滿足條件爲3,book數組記上
現在進行第三行 (此時一,二組都沒執行完) 第三行中第一個已經訪問過,後面有找到對應的位置4 , book數組記上
進入第四行了 (此時一,二,三組都沒執行完) 第四行中找到對應點爲5 book數組記上
進入第五行 也就是目的點了

找到終點了,應當給出條件讓它結束了 此時求出第一組例子的暫且最小值
此時是不是就結束了,並沒有之前一二三組循環並沒有結束 ,
我們回到第四行繼續執行
5這個點找完後 這個循環也結束了
那麼回到 第三個循環 這裏最主要的一點就是在這個時候如果又找到下一個點
那麼之前book中存的不還是生效嘛 所以在每次調用自身之後要將book數組中對應位置清0這步驟很關鍵
這樣到下一個訪問方案時才能夠繼續 按照之前的步驟 只要第一行遍歷結束後整個過程就結束了,此時也會得到最小距離min


  推薦  啊哈,算法   這本書,真的很好   可以一起談論交流  加羣呀:891507813
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章