dijkstra演算法用來解決單源最短路徑問題,即給定圖g和起點s,通過演算法就可以得到s到達其他每個頂點的最短路徑。
比如下面這張圖中,求得了某個結點到達其他各個結點的最短路徑
演算法的具體步驟如下:
我們定義帶權圖g所有頂點的集合為v,接著我們再定義已確定最短路徑的頂點集合為u,初始化集合u為空。然後執行下面操作
1.首先我們將起點x加入集合u,並在陣列a中記錄起點x到各個點的最短路徑(如果頂點到起點x有直接相連的邊,則最短路徑為邊權值,否則為乙個極大值),並設定起點被訪問
2.從陣列a中選擇乙個距離起點x最近的未被訪問的結點v該節點不屬於集合u(如果存在多個這樣的點,任選乙個即可。將頂點v加入集合u,並更新所有與頂點v相連頂點的最短路徑,設定該節點被訪問。
3.重複第二部操作,直至集合u等於集合v(即所有頂點被訪問)
為了能更好地理解這個演算法,我們通過舉例並一步一步地來模擬實現
首先我們將除起點外的所有結點距離設定為無窮大,起點位置距離設定為0
設定該節點被訪問,然後開放這個結點到其他結點的邊,根據邊權更新路徑
然後選出距離v0最近的那個結點(這裡是v1),遍歷到該節點,開放v1到其他結點的邊
然後進行比較:如果v1的距離+邊權比v1連線的結點的距離更小,那麼更新那個點的距離為v1的距離+邊權
比如下圖中,v3原本的值是4,但v1的距離+邊權=3,比v3的距離小,這時,更新v3的距離為3
重複上述操作,直到所有的結點都被訪問為止,此時,每個結點的距離都是到v0的最短距離
演算法模板如下:一般使用鄰接矩陣實現
切記:1.鄰接矩陣,最短距離陣列和bool陣列一定要初始化
2.初始化最短距離陣列後,起點位置的距離要先賦值為0(如果有別的點權,也要先賦值)
#include #include #include using namespace std;
const int maxv = 201;
const int inf = 0x3fffffff;
//鄰接矩陣版本
int n, m, s;
int g[maxv][maxv];
int d[maxv]; //各個點到出發點的最短路徑
bool vis[maxv] = ;
//並查集輸出最短路徑
int f[maxv];
void dijkstra(int s)
} if (u == -1) return; //所有邊訪問完成,演算法完成,退出
//更新每個結點的最小距離
vis[u] = true; //設定本結點為訪問結點
for (int v = 0; v < n; ++v)
} }}void getroute(int e)
}int main()
scanf("%d %d %d", &n, &m, &s);
for (int i = 0; i < m; ++i)
dijkstra(s); //起始點
for (int i = 0; i < n; ++i)
system("pause");
return 0;
}
迪傑斯特拉演算法 資料結構
dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...
迪傑斯特拉演算法
if object id t test is not null drop table t test gocreate table dbo t test id int identity 1,1 not null primary key,自增字段,無意義 header varchar 500 第一點的名...
迪傑斯特拉演算法
dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...