DFS之剪枝 尋路問題

2021-10-18 18:30:00 字數 1274 閱讀 5123

2.用mid[k][m]表示:走到城市k時總過路費為m的條件下,最優路徑的長度。若在後續的搜尋中,再次走到k時,如果總路費恰好為m,且此時的最優長度已經超過mid[k][m],則不必再走下去了。

#include

#include

#include

using

namespace std;

int k,n,r;

struct road

;vector

>

citymap

(110);

//鄰接表citymap是i點有路的集合

int minlen=

1<<30;

//當前最優路徑

int totallen=0;

//當前路徑長度

int totalcost=0;

//當前路徑花銷

int visited[

110]

;//標記是否已經走過

int minl[

110]

[10100];

//從1到i點花銷為j的最短長度

void

dfs(

int s)

for(

int i=

0;i.size()

;++i )}}

intmain()

for(

int i =

0;i <

110;

++i )

for(

int j =

0; j <

10100

;++ j )

minl[i]

[j]=

1<<30;

memset

(visited,0,

sizeof

(visited));

//先將所有的城市都標記為0

visited[1]

=1;//然後把第乙個城市標記為1

dfs(1)

;//呼叫深度搜尋函式

if( minlen

<<30)

)//如果有比極大值小的路徑則輸出

cout << minlen << endl;

else

//如果沒有則輸出-1

cout <<

"-1"

<< endl;

}

網路尋路(dfs)

x 國的乙個網路使用若干條線路連線若干個節點。節點間的通訊是雙向的。某重要資料報,為了安全起見,必須恰好被 兩次到達目的地。該包可能在任意乙個節點產生,我們需要知道該網路中一共有多少種不同的 路徑。源位址和目標位址可以相同,但中間節點必須不同。如圖1所示的網路。1 2 3 1 是允許的 1 2 1 ...

歷屆試題網路尋路(dfs)

問題描述 x 國的乙個網路使用若干條線路連線若干個節點。節點間的通訊是雙向的。某重要資料報,為了安全起見,必須恰好被 兩次到達目的地。該包可能在任意乙個節點產生,我們需要知道該網路中一共有多少種不同的 路徑。源位址和目標位址可以相同,但中間節點必須不同。如下圖所示的網路。1 2 3 1 是允許的 1...

藍橋杯 網路尋路(dfs)

問題描述 x 國的乙個網路使用若干條線路連線若干個節點。節點間的通訊是雙向的。某重要資料報,為了安全起見,必須恰好被 兩次到達目的地。該包可能在任意乙個節點產生,我們需要知道該網路中一共有多少種不同的 路徑。源位址和目標位址可以相同,但中間節點必須不同。如下圖所示的網路。1 2 3 1 是允許的 1...