POJ 1724 ROADS 深度搜尋 剪枝優化

2021-09-22 18:41:09 字數 2130 閱讀 8043

乙個人打算從1城市到達n城市,他想盡快到達那裡,但是他的資金短缺,求他能夠負擔得起的城市1到城市n 的最短路徑。

第一行包含整數k,0 <= k <= 10000,bob可以在路上花費的最大硬幣數。

第二行包含整數n,2 <= n <= 100,即城市總數。

第三行包含整數r,1 <= r <= 10000,道路總數。

以下r行中的每一行通過指定由單個空白字元分隔的整數s,d,l和t來描述一條道路:

s是源城市,1 <= s <= n.

d是目的地城市,1 <= d <= n

l是道路長度,*1 <= l <= 100 *

t是收費(以硬幣數表示),0 <= t <= 100

請注意,不同的道路可能具有相同的源和目的地城市。

從城市1到城市n的最短路徑的總長度,若此路徑不存在,則只應將數字-1寫入輸出。

輸入樣例1:

567

1223

2433

3424

1341

4621

3520

5432

輸出樣例1:

11
對於這道題是一道標準的搜尋題目有很多的解法,我首先就想到了深搜,但是不同路徑可能具有相同的源和目的地城市,而道路的總數最大10000個,如果正常的遍歷肯定會超時。第一次沒什麼經驗就超時了…

time limit exceeded**

#include

#include

#include

using namespace std;

int a,b;

int dis[

10001];

int min1;

struct ok

nb[10001];

//儲存路徑

void

dfs(

int q,

int p,

int k)

//深度搜尋

for(

int i=

0;i}int

main()

memset

(dis,0,

sizeof

(dis));

min1=

99999

;dfs(1

,0,k);

if(min1!=

99999

)printf

("%d\n"

,min1)

;else

printf

("-1\n");

}return0;

}

然後就整理了一下思路,去網上查了一些剪枝的方法,最後使用了乙個類似於找兒子的方法來減少排查的時間,在結構體中定義乙個父節點,用它來作為向上排查的線索再用乙個陣列來記錄最後乙個點。

accepted**

#include

#include

#include

using namespace std;

int first[

101]

,dis[

101]

;int a,b,min1;

struct ok

mu[10001];

//儲存路徑

void

dfs(

int q,

int p,

int k)

//深度搜尋}}

intmain()

min1=

999999

;dfs(1

,0,k);

//呼叫dfs(深搜)

if(min1!=

999999

)printf

("%d\n"

,min1)

;else

printf

("-1\n");

return0;

}

一題有很多方法解的搜尋題,dfs和bfs以及各種方法都可以做的下來,第一眼看到這道題還以為是完全的水題,事實證明我還是太菜了,對於演算法內容的理解還停留在完完全全的初級演算法,對於這方面的思維還是沒有到位,想要提公升還是得經常練。

POJ 1724 Roads 限制最短路

roads 題意 給出一張n個節點的圖,每條邊有長度與花費兩種權值。求在花費c內從點1到點n的最短路徑。有限制條件的最短路。dijkstra將滿足不超過花費的被更新點加入優先佇列 在佇列裡按照長度排序。include include using namespace std const int sn ...

poj 2342 深度搜尋

問題描述 公司辦晚會,每個人都有乙個活躍度,為了氣氛好,要求不能同時把上司和員工分在一起 約束條件 讓你去做出選擇,盡力讓總活躍度最大。很明顯乙個動態規劃問題。sample input 7 1 可以畫棵樹11 1111 1 3 l k,k是l的上司 3是1的上司 5思路是 深搜便利該樹,已訪問過的結...

深度優先搜尋 POJ1979

在一張地圖上,以某一點為基準向上下左右四個方向擴充套件,在四個方向上屬性與基準點相同則認定為同乙個聯通塊,問總共有多少聯通塊?poj1979 給你乙個二維陣列,表示可以到達,表示障礙,表示起始位置,問你能到達的最大地點有多少個,每次只能走上下左右 直接dfs,中間加了很多狀態標記用來剪枝,但是發現沒...