个人心得: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 ;
}

最新文章

  1. Android之SharedPreferences数据存储
  2. python3 -pip
  3. Eclipse 包排版问题
  4. Shader的自定义特性使用
  5. PHP7在linux下的安装步骤
  6. php排序测试
  7. [转]Linux文件权限详解
  8. lnmp安装--php与nginx结合
  9. Android自己定义组件系列【7】——进阶实践(4)
  10. python基础之 sys.argv[]用法
  11. 转:Maven项目编译后classes文件中没有dao的xml文件以及没有resources中的配置文件的问题解决
  12. 使用siege对web接口进行post方式的压力测试
  13. 链表倒数第n个节点
  14. JDBC连接MySQL数据库基础
  15. java对象在内存中的结构
  16. dt常用类
  17. SFTP工具类
  18. 单机多实例mysq 8.0l部署安装
  19. 排列数与For的关系
  20. oracle 11g/12c 密码复杂度验证设置

热门文章

  1. ASC转换BCD,ASC2BCD(转)
  2. JDK1.7之Fork/join
  3. HDU 1241 油田
  4. HBase 协处理器编程详解,第二部分:客户端代码编写
  5. 用户iis可以用外网ip访问,用内网访问报错404
  6. .net 数据脱敏代码实现
  7. JQuery -- 介绍,选择器及其示例, 基本选择器,层次选择器,过滤选择器,表单选择器
  8. ZC__问题
  9. CSS 实现隐藏滚动条同时又可以滚动(转)
  10. angular-messages.js信息验证的使用