关于最短路径的一个简单模板,错误应该会很多,望大家指正
最短路径的步骤
dis数组记录源点到定点的最短距离 例如:源点为0 dis[1]=6 即0-》1最短距离为6
pre数组用于记录路径,从终点往源点有,值记录先驱
1找出源点距离哪个点最近,然后记录最近距离,记录最近点下标,将这个点加入已访问数组。
2.接下来将这个点作为!中介点!,遍历所有顶点,判断是否
顶点未被访问且中介点能到该点且中介点到该点+源点到中介点的距离小于源点到该点的距离
3.满足这三个条件后需要将dis数组内的到该点的值进行替换,pre记录该点的先驱为中介点
4.完成这一过程后,会找到源点距离最近的一个点,且将最近点进入最近集合,n个点循环n次,将dis数组的值完全更新后,即可得出源点到指定地点的最短距离
主要还是在判断部分,如果集合内的中介点b到c比 源点a到c 距离更近,更新
##代码
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int map1[100][100];
int dis[100];//点到远点的距离
int visited[100];
int pre[100];
int n,m,s,d;
void Dijie()
{
//dis给初值
for(int i=0;i<n;i++){
if(s==i) dis[i]=0;
else dis[i]=map1[s][i];
}
while(1){
int k=-1;
visited[s]=1;
int min1=INF;
//找最小值,在与已知集合相连的点中找
for(int i=0;i<n;i++){
if(!visited[i]&&min1>dis[i]){
k=i;
min1=dis[i];
}
}
if(k==-1) break;
visited[k]=1;
//找到当前最短集合以外的一个最小路径点
for(int v=0;v<n;v++){
if(!visited[v]&&map1[k][v]!=INF&&dis[v]>dis[k]+map1[k][v]){
dis[v]=dis[k]+map1[k][v];
pre[v]=k;
}
}
}
}
void print_path(){
while(pre[d]!=d){
cout<<d<<"->";
d=pre[d];
}
}
int main()
{
int x,y,z;
cin>>n>>m>>s>>d;
memset(map1,INF,sizeof(map1));
memset(dis,INF,sizeof(dis));
memset(visited,0,sizeof(visited));
for(int i=0;i<20;i++){
pre[i]=i;
}
for(int i=0;i<m;i++){
cin>>x>>y>>z;
map1[x][y]=z;
map1[y][x]=z;
}
Dijie();
print_path();
for(int i=0;i<10;i++)
cout<<pre[i]<<" ";
}
/*
测试 0到 5的最短路径
6 8 0 5
0 1 1
0 3 4
0 4 4
1 3 2
3 2 2
2 5 1
4 5 3
3 4 3
*/