最短路徑演算法集錦

2022-09-23 20:42:20 字數 3855 閱讀 4368

/*

name: 最短路徑演算法集錦

copyright:

author: 巧若拙

date: 12/11/14 15:32

description:

列舉了深度優先搜尋的遞迴和非遞迴演算法,dijkstra最短路徑演算法,

基於bellman-fort最短路徑演算法的改進型廣度優先搜尋演算法,

floyd-warshall最短路徑演算法的原始版和變化版

本文是閱讀《啊哈!演算法》後的學習筆記,**與教材中有些差異,若有錯誤請指正,謝謝!

測試資料:

5 70 3 2

0 4 9

4 2 1

4 1 3

2 1 1

3 4 2

3 1 8

*/#include

#include

#define max 20 //最大頂點數量

#define maxlen 99999999 //最長路徑

int book[max] = ; //標記該城市是否已經在路徑中

int map[max][max] = ;//鄰接矩陣儲存兩城市間路程

int min = maxlen; //城市間最短距離

int sum = 0;

int deepsearchway_1(int n, int startpos, int endpos);//深度優先搜尋最短路徑驅動程式

void dfs(int n, int curpos, int endpos, int dis);//深度優先搜尋最短路徑子程式

int deepsearchway_2(int n, int startpos, int endpos);//深度優先搜尋最短路徑非遞迴演算法

int dijkstra(int n, int startpos, int endpos);//dijkstra最短路徑演算法

int bfs(int n, int startpos, int endpos);//改進的廣度優先搜尋最短路徑演算法

int floyd(int n, int startpos, int endpos);//floyd-warshall最短路徑演算法

int floyd2(int n, int startpos, int endpos);//floyd-warshall最短路徑演算法(原始版)

int bellman(int n, int startpos, int endpos);//bellman-fort最短路徑演算法

int main()

} printf("\n請按照a b c格式輸入城市間的道路資訊:\n");

for (i=0; i

while (1)

return 0;

}int deepsearchway_1(int n, int startpos, int endpos)//深度優先搜尋最短路徑驅動程式

void dfs(int n, int curpos, int endpos, int dis)//深度優先搜尋最短路徑子程式

for (i=0; i

sum++;}}

int deepsearchway_2(int n, int startpos, int endpos)//深度優先搜尋最短路徑非遞迴演算法

;int stack[max] = ;

int dis[max] = ;

int i, cur, top = 0;

int sum = 0;

for (i=0; i

book[i] = 0;

for (i=0; i

dis[i] = map[startpos][i];

stack[top] = startpos;

book[startpos] = 1;

while (top >= 0)

if (i != endpos)

else

vex[top]++;

}else

sum++;

}else //退棧 }}

printf("搜尋次數為 %d\n", sum);

return dis[endpos];

}int dijkstra(int n, int startpos, int endpos)//dijkstra最短路徑演算法

;int sum = 0;

for (i=0; i

book[i] = 0;

for (i=0; i

dis[i] = map[startpos][i];

book[startpos] = 1;

for (j=1; j

sum++;

}if (v == endpos) //已經找到最短路徑

break;

book[v] = 1;

for (i=0; i

sum++;}}

printf("搜尋次數為 %d\n", sum);

return dis[endpos];

} int bfs(int n, int startpos, int endpos)//改進的廣度優先搜尋最短路徑演算法

;int queue[max] = ;

int sum = 0;

for (i=0; i

book[i] = 0;

for (i=0; i

dis[i] = maxlen;

dis[startpos] = 0;

book[startpos] = 1;

front = rear = 0;

queue[rear++] = startpos;

while (front != rear)

}sum++;

}book[k] = 0;

front = (front + 1) % max;

}printf("搜尋次數為 %d\n", sum);

return dis[endpos];

} int floyd(int n, int startpos, int endpos)//floyd-warshall最短路徑演算法

;int sum = 0;

for (i=0; i

dis[i] = map[startpos][i];

flag = 1;

while (flag)

sum++;}}

}printf("搜尋次數為 %d\n", sum);

return dis[endpos];

} int floyd2(int n, int startpos, int endpos)//floyd-warshall最短路徑演算法(原始版)

;int sum = 0;

for (i=0; i

for (j=0; j

dis[i][j] = map[i][j];

for (k=0; k

sum++;}}

}printf("搜尋次數為 %d\n", sum);

return dis[startpos][endpos];

} int bellman(int n, int startpos, int endpos)//bellman-fort最短路徑演算法

;int u[max*max] = ;

int v[max*max] = ;

int w[max*max] = ;

int sum = 0;

for (i=0; i}}

for (i=0; i

dis[i] = map[startpos][i];

for (i=1; i

sum++;}}

printf("搜尋次數為 %d\n", sum);

return dis[endpos];

}

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

最短路徑演算法

floyd演算法 012345 001 54 1108 1 2 801 3 3 1035 45 302 5413520 floyd 演算法過程描述如下 首先 以邊集 初始化,得到所有的直接連通代價 依次考慮第 k個結點,對於 中的每乙個 i j 判斷是否滿足 s i j s i k s k j 如果...

最短路徑演算法

個人覺得下面 有代表性 最短路徑演算法原始碼 vb 本人載 開發gis,遊自編的最短路徑查詢程式,速度特快,3萬節點,35000條路全部遍歷,只需1秒。現將最短路徑的思路告訴大家,希望大家在優化,並用不同語言編制,我正在學delphi,準備用delphi做成庫,本例以由拓撲關係的arc info 檔...