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...