简介
Dijkstra算法实际上就是不断的贪心,每一次都通过中转点更新其他点到所求点的位置,即每一次都找到最优解。
算法详解
(1) 初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点的距离为起点s到该顶点的距离。
(2) 每一次从U中选出距离源点最近的顶点k,并将顶点k加入到S中;同时,从U中移除顶点k。
(3) 通过把顶点K作为中转点,更新U中各个顶点到起点s的距离。
(4) 重复步骤(2)和(3),直到遍历完所有顶点。
算法实现:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int inf =0x3f3f3f3f;
int map[107][107];
int vis[107];//用于标记是否w访问过,即vis=1代表在S中,vis=0代表还在U中
int dis[107];//每个点距离源点的距离
int n,m;
void init()//初始化距离
{
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j)
map[i][j]=0;
else
map[i][j]=inf;
}
}
memset(vis,0,sizeof(vis));//初始除了第一个点都在U中
}
void getmap()//输入数据,建立领接表
{
for(int i=1;i<=n;i++){
int x,y,w;
cin>>x>>y>>w;
map[x][y]=w;
}
}
void dijkstra(int k)
{
for(int i=1;i<=n;i++)//先初始化各点到源点K的距离
dis[i]=map[i][k];
for(int i=1;i<n;i++)//一共n个点,要进行n-1次
{
int tmp=0,minn=inf;
for(int j=1;j<=n;j++)//选取一个在U中并且距离源点最近的点
{
if(!vis[j]&&dis[j]<minn)
{
minn=dis[j];
tmp=j;
}
}
vis[tmp]=1;//找到z距离最小的,并加入S
for(int j=1;j<=n;j++)
{
if(map[tmp][j]+dis[tmp]<dis[j])//将tmp作为中转站,判断其他点到tmp的距离+tmp到源点的距离和其他点直接到源点的距离谁更短
{
dis[j]=map[tmp][i];
}
}
}
}
int main()
{
cin>>n>>m;
init();
getmap();
dijkstra(1);//1点到其他点的最短路径
cout<<dis[n]<<endl;//输出1-n的最短路径
return 0;
}