(複習)圖論--最短路--Dijkstra演算法
阿新 • • 發佈:2018-12-30
定義:迪傑斯特拉演算法是由荷蘭電腦科學家狄克斯特拉於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
*/