1. 程式人生 > >(複習)圖論--最短路--Dijkstra演算法

(複習)圖論--最短路--Dijkstra演算法

定義:迪傑斯特拉演算法是由荷蘭電腦科學家狄克斯特拉於1959 年提出的,因此又叫狄克斯特拉演算法。是從一個頂點到其餘各頂點的最短路徑演算法,解決的是有向圖中最短路徑問題。迪傑斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。

思路:選一起點(單源問題中的源點),從起點開始拓展,用邊更新每一個點到起點的最小距離,每次選一個到起點距離最短的點進行下一步拓展。

程式碼:

/*
2016.8.7 BulaBulaCHN
*/
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string> #include<cstring> #include<iostream> using namespace std; struct Edge { int from,to; int val,next; }eage[100005]; int tot=0; int head[1005]; void add(int x,int y,int z) { eage[++tot].from=x; eage[tot].to=y; eage[tot].val=z; eage[tot].next=head[x]; head[x]=tot; } int
n,m; int que[1005]; bool book[1005]; int dis[1005]; int top=0,tail=0; int main() { freopen("textdata.in","r",stdin); freopen("textdata.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); add(x,y,z); } for
(int i=1;i<=n;i++) dis[i]=9999999; dis[1]=0; que[++tail]=1; book[1]=1; for(int i=head[1];i;i=eage[i].next) { dis[eage[i].to]=eage[i].val+dis[1]; } while(1) { int point=-1; int mmin=9999999; for(int i=1;i<=n;i++) if(dis[i]<mmin && !book[i]) mmin=dis[i],point=i; if(point==-1) break; book[point]=1; for(int i=head[point];i;i=eage[i].next) dis[eage[i].to]=min(dis[eage[i].to],dis[point]+eage[i].val); } for(int i=1;i<=n;i++) cout<<dis[i]<<" "; fclose(stdin); fclose(stdout); return 0; } /* textdata.in 6 9 1 2 1 1 3 12 2 3 9 2 4 3 3 5 5 4 3 4 4 5 13 4 6 15 5 6 4 textdata.out 0 1 8 4 13 17 */