Dijkstra算法(带路径模板)

个人心得: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,0,sizeof(book));
  for(i=1;i<=n;i++){
    dist[i]=c[v][i];
    if(dist[i]>maxnum) pre[i]=0;
    else pre[i]=v;
  }
  dist[v]=0;
  book[v]=1;
  for(i=1;i<n;i++){
    int temp=maxnum;
    int u=v;
    for(j=1;j<=n;j++){
        if(!book[j]&&dist[j]<temp)
            u=j,temp=dist[j];
    }
    book[u]=1;
    for(j=1;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=1;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=0;i<nu;i++)
        for(int j=0;j<nu;j++)
        if(i!=j)
           c[i][j]=c[j][i]=maxnum;
    else
        c[i][j]=0;
    for(int i=1;i<=m;i++){
        int x,y,z;
        cin>>x>>y>>z;
        c[x][y]=c[y][x]=z;
    }
    dijkstra(n,2);
    traceback(2,4,pre);
    return 0;
}
时间: 2024-07-31 06:15:01

Dijkstra算法(带路径模板)的相关文章

L2-001. 紧急救援 (Dijkstra算法打印路径)

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队. 输入格式: 输入第一行给出4个正整数N.M.S.D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1):M是快速道路的条数:S是出发地的城市编号:D是目的地的城市编号.第二行给出

做了一道跑大数据的最短路挂了,基于vector的二维模拟邻接表实现Dijkstra算法(*【模板】)

代码: #include <stdio.h> #include <string.h> #include <string> #include <vector> #include <algorithm> #define INF 2100000000 using namespace std; int n; struct node { int dd; int w; }t; vector<node>q[500001]; unsigned int

Floyd 算法 打印路径模板

#include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <cmath> #include <cstring> using namespace std; #define INF 0xfffffff #define maxn 40

HDU 2544 最短路(我的dijkstra算法模板、SPAFA算法模板)

思路:这道题是基础的最短路径算法,可以拿来试一下自己对3种方法的理解 dijkstra主要是从第一个点开始枚举,每次枚举出当当前最小的路径,然后再以那最小的路径点为起点,求出它到其它未标记点的最短距离 bellman-ford 算法则是假设有向网中有n 个顶点.且不存在负权值回路,从顶点v1 和到顶点v2 如果存在最短路径,则此路径最多有n-1 条边.这是因为如果路径上的边数超过了n-1 条时,必然会重复经过一个顶点,形成回路:而如果这个回路的权值总和为非负时,完全可以去掉这个回路,使得v1到v

有向网络(带权的有向图)的最短路径Dijkstra算法

什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点之间的距离.指定图中的一顶点为源点,找出源点到其它顶点的最短路径和其长度的问题,即是单源最短路径问题. 什么是Dijkstra算法? 求解单源最短路径问题的常用方法是Dijkstra(迪杰斯特拉)算法.该算法使用的是贪心策略:每次都找出剩余顶点中与源点距离最近的一个顶点. 算法思想 带权图G=<V,

dijkstra算法模板_HDU3790

问题描述:  有n个点,m个边,每条边上有一个权值,求从s节点到e节点的最短路径,即途径路上的权值和为最小. 是求单起点,多终点最短路的问题. dijkstra算法基本思想 1:设置一个distanse数组,存储从起始点s到各个节点的距离(权值和),distanse[i]即从s到i的最短路 2:初始状态,distanse[i]=mp[s][i],found[s]=1 3:每次从所有 1未访问的节点中  挑出 2distanse最小的点k  choose() 进行松弛操作: 4:松弛操作.如果经过

POJ 3255 Roadblocks (次短路径 + Dijkstra算法)

Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7982   Accepted: 2921 Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not want to get to her old home too q

最短路径---dijkstra算法模板

dijkstra算法模板 http://acm.hdu.edu.cn/showproblem.php?pid=1874 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<stdlib.h> 6 #include<algorithm> 7 #include<queue> 8 #include&

训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalog: true mathjax: true tags: - 最短路 - Dijkstra - 图论 - 训练指南 Airport Express UVA - 11374 题意 机场快线有经济线和商业线,现在分别给出经济线和商业线的的路线,现在只能坐一站商业线,其他坐经济线,问从起点到终点的最短用时是多少,还有