迪杰斯特拉算法简单分析
迪杰斯特拉算法主要是產生從源點到其他點的最短路徑,換句話說這些最短路徑也有著長短的區別。
迪杰斯特拉算法的主要思路:
1.按照長短依次來產生最短路徑。
2.并且在產生最短路徑的過程中,用現有最短的最短路徑來進行松弛操作。
具體實現的方法:數據結構:1個鄰接矩陣啊a[n][n],1個一位數組dis[n](用來存最短路徑),加上一個標記數組flag[n](這個數組一定要有,已經用來松弛過的邊就不能再使用了)。
大致流程:
1.首先一個for循環對dis數組進行初始化。
2.緊接著一個for循環用來依次產生最短路徑,里面嵌套兩個for循環,一個用來找到當前最短的最短路徑,下一個用來進行松弛操作。
看個模板題:
hdu2544
Problem Description
在每年的校賽里,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?
Input
輸入包括多組數據。每組數據第一行是兩個整數N、M(N<=100,M<=10000),N表示成都的大街上有幾個路口,標號為1的路口是商店所在地,標號為N的路口是賽場所在地,M則表示在成都有幾條路。N=M=0表示輸入結束。接下來M行,每行包括3個整數A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A與路口B之間有一條路,我們的工作人員需要C分鐘的時間走過這條路。 輸入保證至少存在1條商店到賽場的路線。
Output
對于每組輸入,輸出一行,表示工作人員從商店走到賽場的最短時間。
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
代碼:
#include <iostream>
#define INF 99999999
#include <string.h>
using namespace std;
int a[110][110],dis[110],flag[110];
void dijkstra(int n,int start){
for(int i=1;i<=n;i++){
dis[i]=a[start][i];
}
int minl,tmp;
memset(flag,0,sizeof(flag));
for(int i=2;i<=n;i++){
minl=INF;
for(int j=2;j<=n;j++){
if(dis[j]<minl&&flag[j]==0){
minl=dis[j];
tmp=j;
}
}
for(int j=2;j<=n;j++){
if(dis[tmp]+a[tmp][j]<dis[j])
dis[j]=dis[tmp]+a[tmp][j];
}
flag[tmp]=1;
}
}
int main(){
int n,m;
int x,y,path;
while(cin>>n>>m&&n!=0&&m!=0){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(i!=j)
a[i][j]=INF;
else
a[i][j]=0;
}
for(int i=1;i<=m;i++){
cin>>x>>y>>path;
a[x][y]=a[y][x]=path;
}
dijkstra(n,1);
cout<<dis[n]<<endl;
}
return 0;
}
補充:
迪杰斯特拉算法是A*算法的最簡單版本(無啟發式函數),也是我們常說的一致代價搜索。
迪杰斯特拉算法最好采用優先隊列的形式來實現,方便后面進行各種改進。
總結
以上是生活随笔為你收集整理的迪杰斯特拉算法简单分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10电脑黑屏图片壁纸如何设置
- 下一篇: MySQL中的explain怎么用