HDU 1428 漫步校園 特殊的最短路

2022-03-16 20:58:17 字數 1422 閱讀 5809

這裡需要讀懂題意中的一句話「另外,他考慮從a區域到b區域僅當存在一條從b到機房的路線比任何一條從a到機房的路線更近(否則可能永遠都到不了機房了…)。」

這句話的意思是從(1, 1)(n, n)的所有路徑中,只選擇距離最短的路徑,並輸出最短路徑的條數。就是我們找出最短距離後,看看有多少條路到達目的地是最短距離。

從題意我們也就知道了,我們需要找出每個點到目的地的最短路是多少。這裡我們最先想到的就是一些最短路的演算法了,比如dijkstra演算法,需要注意的是這裡的圖形是乙個矩陣,而不是普通的那種圖,所以這裡的最短路演算法和常見的最短路演算法有些不同,這裡的bfs函式其實也是使用的這個最短路演算法的思想,也是找出乙個點來進行鬆弛。

還有需要注意點的是我們要倒過來進行最短路的計算,計算從(n, n)到其他各個點的最短路徑。為什麼要這樣呢?因為我們的演算法是單源最短路,我們需要知道所有的點到終點的最短路,如果是從(1, 1)開始計算,我們得到的是從(1,1)到各個點的最短路經,思路反過來就能解決,真神奇!

接下來我們就要計算出有多少條路了,如果沒有要求的話,最容易想到的是可以使用dfs來計算出路徑的種類,這裡我也是這樣做的,但是這個題有條件,每一步只能最近的路,上面我們已經知道了每個點到終點的最短距離了,我們使用dfs進行拓展的時候可以判斷我們要走的下乙個點是不是最優的那個點(注意,可能下一步的最優點可能由多個),其實就是多了個條件判斷,很有意思。

下們就是實現的**。

#include#include#include#include#include#include#include#include#include#include#includetypedef long long ll;

using namespace std;

const double esp=1e-6;

const int inf=0x3f3f3f3f;

const int maxn=50+7;

struct node

node(int a, int b)

};int gox[4] = ; //上下左右

int goy[4] = ;

int mp[maxn][maxn], dis[maxn][maxn];

ll road[maxn][maxn];

bool vis[maxn][maxn];

int n;

void bfs()

} } }

}ll dfs(int x, int y)

return road[x][y];

}int main()

bfs();

cout<} return 0;

}

記憶化搜尋 hdu1428 漫步校園

思路 有幾條可到達的路線是很常規的dp,假設u v 那麼dp u dp v 下一步一定要更加逼近終點而不是遠離終點,用bfs去跑距 n,n 的最短路徑。本題可以與dijkstra堆優化過程中統計最短路條數進行對比 本題 dp i j i,j 到終點的最短路條數 採用記憶化搜尋方式,自下而上 dijk...

hdoj 1428 漫步校園 BFS DFS

題目 hdoj 1428 漫步校園 分析 題意還是有必要說的,他考慮從a區域到b區域僅當存在一條從b到機房的路線比任何一條從a到機房的路線更近,注意這句話,可見先讓你求每個點到機房 n,n 點的最短路。當然這裡用bfs比較好,注意要用優先佇列.接著這句話告訴你,每次選擇走的時候可以有多種選擇,只要滿...

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

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