hdu 1142 最短路 記憶化

2022-09-17 21:09:19 字數 1508 閱讀 9589

最短路+記憶化搜尋

hdu 1142 a walk through the forest

> 題意:找出不同的路徑條數,假如jimmy要從a走到b的話滿足jimmy從b到家的距離比從a到家的距離短

> 這樣我們可以通過最短路演算法,找出從家(看成源點)到各個點的最短路徑長度,記做d[v]。 然後就可以從起點(office)

> dfs,首先從某點i到某點j走得通,然後滿足d[j]

> 所以這裡要用記憶話搜尋,減少重複計算某個乙個狀態的值。 對於最短路和記憶化,本人也是剛剛學習的,最短路模仿的資料結構書上的

> dijkstra,記憶化也是借鑑別人的思路。不過我想說說子結構的重複計算 比如 0

> 1 2

> 3 4 5 6

> 7 8 9

>  10   dfs(0) 是 從0到10的所以路徑條數(假設走法隨意,只要深度+1即可) dfs(4)是從4到10的路徑條數,1可以到4,2也可以到4.

> 那麼dfs(1)後肯定已經計算過dfs(4)了,dfs(2)就沒必要再計算,直接用這個結果就行了 所以可以用個陣列儲存即可

> 再囉嗦一句,題庫分這題在並查集裡面,有哪位大神能教我並查集怎麼做?

#include#include

#include

using

namespace

std;

typedef

struct

amgraph;

amgraph g;

int d[1010],path[1010],s[1010],dp[1010];///

這裡忽略掉path吧,沒用到

const

int maxint = 1000000000

;int

n,m;

void createg(amgraph &g)

}void shortestflyod(amgraph &g,int v0)///

書上**,不懂得還是看書吧

s[v0] = 1

; d[v0] = 0

;

for(int i =2 ; i<=n; i++)

s[v] = 1

;

for(w = 1; w<=n; w++)

if(!s[w]&&d[v]+g.arcs[v][w]}

}int dfs(int

v)

if(dp[v]) return dp[v];///

計算過,直接返回

for(int i = 1; i<=n; i++)

if(g.arcs[v][i]!=maxint&&d[i]//

連通且滿足條件

dp[v] += dfs(i);//

dp[v] 等於下面乙個分支的路徑數之和

return

dp[v];

}int

main()

return0;

}

hdu1142(dj 記憶化搜尋)

題意 給你n各點,m行關於這些點的聯通關係,以及距離,求從1這個點到2這個點之間,下乙個點到2這個點比當前點到2這個點的距離要小的路徑的條數.思路 dj 記憶化搜尋.include include includeusing namespace std typedef int64 ss define ...

hdu1142(dj 記憶化搜尋)

題意 給你n各點,m行關於這些點的聯通關係,以及距離,求從1這個點到2這個點之間,下乙個點到2這個點比當前點到2這個點的距離要小的路徑的條數.思路 dj 記憶化搜尋.include include includeusing namespace std typedef int64 ss define ...

Hdu 1428(記憶化搜素 最短路)

hdu 1428 思路 求出圖的逆向最短路,即每個點到 n,n 的最短路,然後求出 1,1 到 n,n 的最短路的數量,num i j 記錄點 1,1 到 i,j 過程中的最短路的條數,然後遇到之前求過最短路的點就直接返回,否則求解後再返回。參考文章 include include include ...