HDOJ 1142 A Walk Through the Forest 【Dijkstra】+【DFS】

來源:互聯網
上載者:User

標籤:dijkstra   dfs   

題意:從2到1的所有路徑中找出最短的路,並且輸出最短路徑有幾條。

策略:先求出最短路徑,然後再找出從2到1的最短路徑有幾條。最短路徑用dijkstra演算法來求出,什麼是dijkstra演算法,簡單來說,dijkstra演算法就是路徑長度遞增次序產生最短路徑的演算法:
基本思想是:把集合V分成兩組;
(1)S:已求出最短路徑的頂點的集合
(2)V-S=T:尚未確定最短路徑的頂點集合
將T中頂點按最短路徑遞增的次序加入到S中,
保證:(1)從源點V0到S中各頂點的最短路徑長度都不大於
                      從V0到T中任何頂點的最短路徑長度
            (2)每個頂點對應一個距離值
                     S中頂點:從V0到此頂點的最短路徑長度
                     T中頂點:從V0到此頂點的只包括S中頂點作中間
                                       頂點的最短路徑長度

話不多說,思想是基礎,最重要的還是怎麼樣實現:我們就以這道題為例子:

代碼:

#include<stdio.h>#include<string.h>#define INF 0x3f3f3f3f//不能換成0x7fffffff, 因為下面有個di[min_pos]+INF, 結果是會超INT範圍的#define MAXN 1007int map[MAXN][MAXN], di[MAXN], ans[MAXN]; //map是鄰接矩陣, di是儲存的源點到各點的最小距離bool vis[MAXN];//標記int n;void dijkstra(int v){int i, j;memset(vis, 0, sizeof(vis)); //初始化di[v] = 0;vis[v] = 1;for(i = 1; i <= n; i ++){if(!vis[i]){di[i] = map[v][i];  } } for( i = 1; i < n; i ++){int min = INF;int min_pos = 0;//這個一定要等於0,不然的話會REfor(j = 1; j <= n; j ++){if(!vis[j]&&di[j] < min){min = di[j];min_pos = j;}}vis[min_pos] = 1;for(j = 1; j <= n; j ++){if(!vis[j]&&di[j] > map[min_pos][j]+di[min_pos]){di[j] = map[min_pos][j]+di[min_pos];}}}}int dfs(int v) //深搜:原理:從1點出發,每次一都找比當前di[v]小的點,找到二就說明有一條最短路徑{if(ans[v] != -1) return ans[v];  //記憶化搜尋if(v == 2) return 1;//找到2就說名有一條路ans[v] = 0;  //初始化for(int i = 1; i <= n; i ++){if(map[v][i]!= INF&&di[i] < di[v]){  //map[v][i]!= INF 是為了判斷v與i是不是有路ans[v] += dfs(i);}}return ans[v];}int main(){int m, i, j, a, b, c;while(scanf("%d", &n), n){scanf("%d", &m);for(i = 1; i <= n; i ++){//初始化,map[i][i] = 0;map[i][j] = INF;for(j = 1; j <= n; j ++){map[i][j] = i==j?0:INF;}}for(i = 0; i < m; i ++){scanf("%d%d%d", &a, &b, &c);map[a][b] = map[b][a] = c;}dijkstra(2);//for(i = 1; i <= n; i ++){//printf("%d..%d\n", di[i], i);//}memset(ans, -1, sizeof(ans));printf("%d\n", dfs(1));}return 0;} 



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.