dijkstra演算法
_ ** 時隔多月,我又回來了!**_
今天下午久違的又學了會兒演算法,又重新學習了一遍dijkstra,這是第三次重新學習dijkstra(*以前學的都忘完了》_<*).
廢話先不bb,上**。
#includeusingnamespace
std;
#define inf 9999999
#define m 1000
intd[m];
int p[m]=;
intcon[m][m];
int n,line; //
n點數,邊數line
struct
nodew[m];
void dijkstra(int v,int *d,int p,int con[m][m]) //
初始點v
d[v]=0; //
對第乙個點初始化
vis[v]=1
;
for(int i=1;i<=n;i++) //
第二布,兩重迴圈 ,每次迴圈又分兩步 。判斷所有點
}
vis[id]=1; //
已判斷過 ,已經走過
for(int j=1;j<=n;j++) //
2、 從此時距離最短的點出發,更新與id相連的點的值,有兩種情況 }}
}}int idex(char
a)void fun(int *p,char fist,char
last)
cout
=0;i--) cout
<<"
->
"
<<"\n"
;}intmain()
for(int i=1;i<=line;i++)
}cout
<< "
*****無向網g建立完成!*****\n";
for(int i=1;i<=n;i++)
d[i]=inf;
for(int i=1;i<=n;i++)
printf("\n
");}
cout
<<"
請輸入起點和終點:";
cin>>a>>b;
dijkstra(idex(a), d, p, con);
cout
<< a<<"
到最後"
<"
的最短路徑長度為:
"<< d[idex(b)] <<"\n"
;
fun(p,a,b);
return0;
}
這次學習總結了dijkstra演算法模板函式的幾個主要步驟,因為這個函式沒有用到遞迴,只
用了兩個迴圈,因此可以分為從上到下的兩步。
dijkstra演算法模板函式主要有兩步:
一、
確定與初始點v連線的點的路徑 ,檢查所有與初始點連線的點並更新他們的d[i]值。
二、
乙個二重巢狀迴圈,每次for迴圈裡又分兩步:
1、
找出此次迴圈中(d[i]中)距離值最小的,並分別用id,a記錄該點對應的下標與d[i].
2、
以這個點(id)為初始點,更新所有與該點相連通的點(d陣列).
重複第二步。
**以上。**
最短路徑之Dijkstra演算法詳細講解
最短路徑演算法 在日常生活中,我們如果需要常常往返a地區和b地區之間,我們最希望知道的可能是從a地區到b地區間的眾多路徑中,那一條路徑的路途最短。最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖 由結點和路徑組成的 中兩結點之間的最短路徑。演算法具體的形式包括 確定起點的最短路徑問題 即已知...
最短路徑之Dijkstra演算法詳細講解
最短路徑演算法 在日常生活中,我們如果需要常常往返a地區和b地區之間,我們最希望知道的可能是從a地區到b地區間的眾多路徑中,那一條路徑的路途最短。最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖 由結點和路徑組成的 中兩結點之間的最短路徑。演算法具體的形式包括 確定起點的最短路徑問題 即已知...
最短路徑之Dijkstra演算法詳細講解
2009 01 12 23 08 48 分類 3s 舉報 字型大小訂閱 最短路徑演算法 在日常生活中,我們如果需要常常往返a地區和b地區之間,我們最希望知道的可能是從a地區到b地區間的眾多路徑中,那一條路徑的路途最短。最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖 由結點和路徑組成的 中兩...