算法分析
dijkstra
是通过每一次在基于已经求出的最短路径上一步求得更远顶点的最短路径
dis | 0 | 1 | 2 | 3 | 4 | 5 | |||
0 | 无穷 | 无穷 | 无穷 | 无穷 | 无穷 |
找到未标记的且离起点最近的点0,标记0点已确定最短距离st[0]=1,用0点去更新1点dis[0]+2和2点dis[0]+3;
dis | 0 | 1 | 2 | 3 | 4 | 5 | |||
0 | 2 | 3 | 无穷 | 无穷 | 无穷 |
找到未标记的且离1点最近的点3点4,标记点1已确定最短距离st[1]=2,用点1去更新点3dis[1]+5和4点dis[1]+1;
dis | 0 | 1 | 2 | 3 | 4 | 5 | |||
0 | 2 | 3 | 7 | 3 | 无穷 |
......
以此类推,一直进行到所有的点都标记过
此外,如果要求点i到点j的最短距离,只需修改dijkstra方法中的起源位置dist[i] = 0,以及返回为dist[j]
代码实现
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=505;
int arc[N][N];//稠密图->邻接矩阵
//有没有人可以帮我解释下怎么界定稠密图和稀疏图
int dis[N] ;//每一个点到起点距离
int st[N];//标记最短路是否已经确定
int i, j,t,n,m;//n个顶点,m条边
int dijkstra()
{
memset(dis,0x3f,sizeof dis);//将起点到所有点的距离初始化为无穷大
dis[1]=0;//起点到起点的距离为0
for(i=0;i<n;i++)//每次求得起点到某个顶点v的最短距离
{
t=-1;
for(j=1;j<=n;j++)
{
//判断最短路径是否确定和是否有更短路径
if(!st[j]&&(dis[t]>dis[j]||t==-1) )
{
t=j;//发现更短路径后更新
}
}
st[t]=1;//标记已经确定到第t个点的最短路径
//在刚才已经找到起点到某个点的最短距离的基础上,对某个点与其他顶点的距离进行计算,得到顶点和其他顶点间的最短距离
for(j=1;j<=n;j++)
{
dis[j]=min(dis[j],dis[t]+arc[t][j]);//修改当前路径长度
}
}
if (dis[n] == 0x3f3f3f3f){
return -1;
}
return dis[n];
}
int main()
{
memset(arc,0x3f,sizeof arc);
cin>>n>>m;
while(m--)
{
int a,b,c;
cin>>a>>b>>c;//a点到b点的距离c
arc[a][b]=min(arc[a][b],c);//重边的话选距离短的那条
}
cout<<dijkstra();
return 0;
}