最短路+記憶化搜尋
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 ...