貨員的難題 DFS 鄰接表

2021-10-01 13:39:14 字數 1854 閱讀 6204

time limit:10000ms memory limit:65536k

total submit:297 accepted:161

case time limit:5000ms

description

某鄉有 n 個村莊(1<

n<40)

( 1 < n <40 )

(1<n<4

0),有乙個售貨員,他要到各個村莊去售貨,各村莊之間的路程 s(0

<s

<1000

)s(0<s<1000)

s(0<s<

1000

)是已知的,且 a

aa村與 b

bb 村與 b

bb 村與 a

aa 村的路大多不同,為了提高效率,他從商店出發到每個村莊一次,然後返回商店所在的村,假設商店所在的村莊為 1

11,他不知道選擇什麼樣的路才能使所走的路程最短,請你幫助他選擇一條路徑。

input

村莊數 n

nn 和各村之間的路程(均是整數)

output

最短路程

sample input

3 // 村莊數量

0 2 1 // 村莊 1 到各村的路程

1 0 2

2 1 0

sample output

3其實在做這道題之前,已經用深搜+鄰接矩陣 a過一次,可老師讓我們用深搜+鄰接表再做了一遍,其實都差不多,只是會有更多地方要注意(我就是因為不細心wa了10分鐘)。。。

好了回歸正題。。。

我們從第 1 個點開始搜尋,記錄下經過的路徑總長,當再次經過 1且遍歷完了所有的村莊時,我們就更新最小值 。你認為這樣就能a了嗎???

n o!

!!no

!!!n

o!!!

no!!! no!!! no!!!

no!!!n

o!!!

no!!

!因為你會tle

!!

!tle!!!

tle!!!

對於這道題目,仔細思考一下,就可以發現乙個剪枝,就是說,當我們目前經過的總長度大於等於我們記錄下來的目前最小的總長度,那麼我們就沒必要繼續找下去了,因為繼續往後面走值肯定會變大,所以這種狀態無法更新最小值,故我們可以將它"剪掉"。

好了,思路結束,**呈上。。。

#include

#include

#include

#include

using namespace std;

int n,k=

0,head[

100000

],ans=

1000000000

,f[100];

struct ca[

100000];

void

add(int xx,int yy,int zz)

void

dfs(int dep,int s,int xx)

if(f[1]

==1)return;if

((s+n-dep+1)

>ans)

return

;//剪枝

for(int i=head[xx]

;i;i=a[i]

.next)}}

int main()

dfs(1,

0,1)

;printf

("%d"

,ans)

;return0;

}

貨員的難題(DFS)

這題我在洛谷得了80分,此結果僅供參考 題目描述 某鄉有n個村莊 1if c f i to 0 下乙個點你能不能走 if f i to 1 ans n 1 dfs f i to,sum f i s,ans 1 下乙個點是起點,且其他村莊已走過 分開來 include using namespace ...

DFS 基於鄰接表

include using namespace std define maxvnum 100 頂點最大數 bool visited maxvnum 訪問標誌陣列,其初值預設為 false typedef char vextype 頂點的資料型別 typedef struct adjnode adjn...

售貨員的難題

售貨員的難題 5000 ms 65535 kb 675 3441 tags 動態規劃 某鄉有n個村莊 1 n 20 有乙個售貨員,他要到各個村莊去售貨,各村莊之間的路程s 0 s 1000 是已知的,且a村到b村與b村到a村的路大多不同。為了提高效率,他從商店出發到每個村莊一次,然後返回商店所在的村...