Dijkstra

原创 2018年04月17日 11:02:20

img

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long LL;
const int inf = 1 << 30;
const LL INF = 1LL << 60;
const int MaxN = 2000;

int n, T;
int all;
int pre[2 * MaxN + 5], last[MaxN + 5], other[2 * MaxN + 5];
int cost[2 * MaxN + 5];
int dis[MaxN + 5];

struct Node {
    int id, d;
    Node () {}
    Node (int a, int b) : id(a), d(b) {}
    bool friend operator < (Node a, Node b) {
        return a.d > b.d;
    }
};

void build(int x, int y, int w) {
    pre[++all] = last[x];
    last[x] = all;
    other[all] = y;
    cost[all] = w;
}

void Dijkstra(int s) {
    for(int i = 1; i <= n; i++) dis[i] = inf;
    dis[s] = 0;
    priority_queue <Node> pq;
    pq.push(Node(s, 0));
    while(!pq.empty()) {
        Node now = pq.top();
        pq.pop();
        int ed = last[now.id];
        while(ed != -1) {
            int dr = other[ed];
            if(dis[now.id] + cost[ed] < dis[dr]) {
                dis[dr] = dis[now.id] + cost[ed];
                pq.push(Node(dr, dis[dr]));
            }
            ed = pre[ed];
        }
    }
}

int main() 
{
    while(scanf("%d %d", &T, &n) != EOF)
    {
        all = -1; memset(last, -1, sizeof(last));
        for(int i = 1; i <= T; i++) {
            int u, v, w;
            scanf("%d %d %d", &u, &v, &w);
            build(u, v, w); build(v, u, w);
        }
        Dijkstra(1);
        printf("%d\n", dis[n]);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dreams___/article/details/79971815

dijkstra算法

  • 2010年12月11日 20:11
  • 174KB
  • 下载

DIJKSTRA程序算法示例

DIJKSTRA程序算法示例 Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最...
  • lusongno1
  • lusongno1
  • 2017-01-22 13:59:50
  • 750

Dijkstra算法的实现及原理

算法用处与基本思想Dijkstra算法的作用是求指定点到图中任何一点的最短路径。 其基本思路与BFS(深度优先搜索)有些类似,但不同的是BFS用的是一般队列,也就是严格的先进先出。而Dijkstra...
  • SCaryon
  • SCaryon
  • 2017-06-28 21:46:53
  • 2450

再谈Dijkstra算法和堆优化

用邻接矩阵的Dijkstra算法的代码: int mp[maxn][maxn]; int dis[maxn]; bool visit[maxn]; int n,m;   //V,E     void ...
  • major_zhang
  • major_zhang
  • 2017-05-19 10:47:10
  • 2451

Dijkstra算法介绍

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。  它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 基本思想     ...
  • ljlstart
  • ljlstart
  • 2016-04-28 21:33:07
  • 532

比较Dijkstra算法和最小生成树prim算法之间的区别

我们先看看他们的模板:
  • qq_15681523
  • qq_15681523
  • 2014-08-27 21:44:59
  • 1525

dijkstra算法O(n²) 堆优化O(nlogn)

用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法。也就是说,只能计算起点只有一个的情况。 Dijkstra的时间复杂度是O (N2),它不能处理存在负边权的情况。 算法描述: ...
  • DCrusher
  • DCrusher
  • 2015-11-05 21:51:03
  • 7015

堆优化的dijkstra算法(以邻接表存储)

堆优化的dijkstra 对于dijkstra为单源最短路的算法,其未优化版本为直接遍历每个点来寻找到源点最近的点,再以该点去更新与之相连的点,直到将每个点都利用更新其他点,这样便寻找到了从源点K出发...
  • xuxianbo123
  • xuxianbo123
  • 2015-08-20 15:54:25
  • 1698

dijkstra算法+堆优化 ///各种被坑~~~

主要思想:在选取当前距离最小点时,用堆的方法实现选最小点上时间的优化。 新手第一次写,各种被坑!!! 1、一定要用最小堆从堆顶取值,而不能用最大堆取排在最后的值,因为排在最后的值不一定是最小的。 2、...
  • lijiashushu
  • lijiashushu
  • 2017-03-04 20:01:58
  • 793

基本算法dijkstra的POJ水题推荐

首先转载一个别人归纳的题目集合: 1.poj1062 昂贵的聘礼(中等)     此题是个经典题目;用Dijkstra即可;但是其中的等级处理需要一定的技巧;    要理解好那个等级制度;这个处...
  • lwtdzh999
  • lwtdzh999
  • 2016-03-07 21:49:41
  • 1126
收藏助手
不良信息举报
您举报文章:Dijkstra
举报原因:
原因补充:

(最多只允许输入30个字)