乙個人打算從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,中間加了很多狀態標記用來剪枝,但是發現沒...