1381:城市路Dijkstra
1.【题目描述】
【题目描述】
【题目描述】
罗老师被邀请参加一个舞会,是在城市n,而罗老师当前所处的城市为1,附近还有很多城市2~n-1,有些城市之间没有直接相连的路,有些城市之间有直接相连的路,这些路都是双向的,当然也可能有多条。
现在给出直接相邻城市的路长度,罗老师想知道从城市1到城市n,最短多少距离。
【输入】
输入n, m,表示n个城市和m条路;
接下来m行,每行a b c, 表示城市a与城市b有长度为c的路。
【输出】
输出1到n的最短路。如果1到达不了n,就输出-1。
【输入样例】
5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
【输出样例】
90
【提示】
【数据规模和约定】
1≤n≤2000
1≤m≤10000
0≤c≤10000
2.【Dijkstra算法】
Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。
代码:v数组代表邻接矩阵
dis数组代表最短路径
b数组代表是否走过
Dijkstra具体思路可以看注释
3.【代码】
#include<bits/stdc++.h>
#define inf 9999999999
#define N 3001
#define M 30001
using namespace std;
int v[N][N],dis[M],b[M],n,m;
int main()
{
//Dijkstra求单源最短路径
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int k=1;k<=n;k++)
v[i][k]=inf;
for(int i=1;i<=m;i++)
{
int x,y,e;
cin>>x>>y>>e;
v[x][y]=v[y][x]=min(v[y][x],e);
}
//第一步:先找到m点到任何点的最短路径
for(int i=2;i<=n;i++)
dis[i]=v[1][i];
//第二步:b数组用来标记
memset(b,0,sizeof(b));
b[1]=1;//第m点默认已经找到最短路径
for(int i=1;i<=n-1;i++)
{
int min1=inf;
int z=1;
//找到当前到达m点的最小值
for(int k=1;k<=n;k++)
if(dis[k]<min1&&b[k]==0)
{
min1=dis[k];
z=k;
}
b[z]=1;//当前最小值在z点
for(int x=1;x<=n;x++)
if(v[z][x]<inf)//判断当前点能走通
if(dis[x]>dis[z]+v[z][x])//判断最短路径
dis[x]=dis[z]+v[z][x];
}
if(dis[n]==inf)
{
cout<<-1;
return 0;
}
cout<<dis[n];
return 0;
}
仅供参考!