Dijkstra算法(带路径模板)
2024-10-15 04:37:06
个人心得:Dijkstra算法是贪心思想的一种延伸,注意路径pre,pre数组表示此时最短路径中的前一个顶点。每次更新到目的点时更新;
从源点出发,更新路径,然后找出此时最短的点,然后以这个点为头,看能否缩减路程,
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<algorithm>
using namespace std;
#define inf 1<<29
#define nu 10005
#define maxnum 100000
int n,m;
int c[nu][nu];
int dist[nu];
int pre[nu];
int book[nu];
void dijkstra(int n,int v){
int i,j;
memset(book,,sizeof(book));
for(i=;i<=n;i++){
dist[i]=c[v][i];
if(dist[i]>maxnum) pre[i]=;
else pre[i]=v;
}
dist[v]=;
book[v]=;
for(i=;i<n;i++){
int temp=maxnum;
int u=v;
for(j=;j<=n;j++){
if(!book[j]&&dist[j]<temp)
u=j,temp=dist[j];
}
book[u]=;
for(j=;j<=n;j++){
if(!book[j]&&c[u][j]<maxnum)
{
if(dist[j]>dist[u]+c[u][j]){
dist[j]=dist[u]+c[u][j];
pre[j]=u;
}
}
}
}
for(int i=;i<=n;i++)
cout<<dist[i]<<endl;
}
void traceback(int v,int i,int pre[])
{
cout<<i<<" <--";
i=pre[i];
if(i!=v) traceback(v,i,pre);
if(i==v) cout<<i<<endl;
}
int main()
{
cin>>n>>m;
for(int i=;i<nu;i++)
for(int j=;j<nu;j++)
if(i!=j)
c[i][j]=c[j][i]=maxnum;
else
c[i][j]=;
for(int i=;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
c[x][y]=c[y][x]=z;
}
dijkstra(n,);
traceback(,,pre);
return ;
}
最新文章
- Android之SharedPreferences数据存储
- python3 -pip
- Eclipse 包排版问题
- Shader的自定义特性使用
- PHP7在linux下的安装步骤
- php排序测试
- [转]Linux文件权限详解
- lnmp安装--php与nginx结合
- Android自己定义组件系列【7】——进阶实践(4)
- python基础之 sys.argv[]用法
- 转:Maven项目编译后classes文件中没有dao的xml文件以及没有resources中的配置文件的问题解决
- 使用siege对web接口进行post方式的压力测试
- 链表倒数第n个节点
- JDBC连接MySQL数据库基础
- java对象在内存中的结构
- dt常用类
- SFTP工具类
- 单机多实例mysq 8.0l部署安装
- 排列数与For的关系
- oracle 11g/12c 密码复杂度验证设置