[hiho 23]单源最短路-Dijstra算法

题目描述

维护一个集合,集合中的元素与点u的最短距离已经确定,求出集合内元素所能到达的点到点u的距离,取最短的距离对应的点加入集合直到集合包含点v。

每次更新距离只与新加入集合的点有关。

#include <stdio.h>
#include <string.h>
#include <algorithm>

#define N 1005

unsigned w[N][N];

int main(){
    memset(w, -1, sizeof(w));
    int n, m, u, v;
    scanf("%d%d%d%d", &n, &m, &u, &v);
    int from, to;
    unsigned weight;
    for (int i = 0; i < m; i++) {
        scanf("%d%d%u", &from, &to, &weight);
        weight = std::min(weight, w[from][to]);
        w[from][to] = w[to][from] = weight;
    }
    int min_idx;
    unsigned min;
    while (true) {
        min_idx = 1;
        min = w[u][1];
        for (int i = 2; i <= n; i++) {
            if (min > w[u][i]) {
                min = w[u][i];
                min_idx = i;
            }
        }
        for (int i = 1; i <= n; i++) {
            if (w[min_idx][i] != (unsigned)-1) {
               w[u][i] = std::min(w[u][i], w[u][min_idx] + w[min_idx][i]);
            }
        }
        if (min_idx == v) {
            break;
        } else {
            w[u][min_idx] = -1;
        }
    }
    printf("%u\n", w[u][v]);
    return 0;
}
时间: 2024-10-25 20:56:56

[hiho 23]单源最短路-Dijstra算法的相关文章

单源最短路Dijstra算法

Dijstra算法是寻找从某一顶点i出发到大其他顶点的最短路径.Distra算法的思想与Prim算法很像,它收录顶点的规则是按照路径长度递增的顺序收录的.设v0是源顶点,我们要寻找从v0出发到其他任意一点的最短路径.设已经求解的顶点(已经找到从v0出发到达该顶点最短路径的顶点)组成的集合是S={v0,v1,...vk};在收录下一个顶点v的时候要么是(v0,v),要么是(v0,vj,v);如果是后者,则一定有vj∈S,这一点很容易用反正法证明.Dijstra算法的时间复杂度是O(V^2),若是稀

图论-单源最短路-SPFA算法

有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表存储有向图,di存放从起点到结点i的最短路,q为队列,保存待处理节点 思路: 首先指定起点入队,取当前队头结点u,沿每一条与u相连的边向外扩展,对该边所指向的结点v松弛(比较当前dv与当前du加此边长,更新最短路值dv,以及最短路径prev)如果v不在队列中且更新了最短路值,v进队,直至队列中没有元

单源最短路 Bellman-Ford算法

单源最短路问题是固定一个起点s,求它到所有点的最短路的问题. Bellman-Ford算法可以用于边权为负的情况而不像Dijkstra只适用于边权为正的情况(有负圈返回错误),但是其效率比较低. 记从起点s出发到顶点i的最短距离为的d[i] 那么 d[i] = min(d[j]+(j->i)|其中j->i属于E) 如果给定的图是DAG 那么可以用拓扑序给顶点编号,并利用这一条递推公式计算出d(DP). 如果图中有圈,就无法依赖这样的顺序进行计算.这种情况初始d[s]=0 d[i]=INF 再不

单源最短路Dijkstra算法——matlab实现

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且U中顶点的路径是"起点s

单源最短路——Dijkstara算法

算法基本思想:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径. 1.将所有的顶点分为两个部分:已知最短路程的顶点集合P和未知最短路径的顶点集合Q 2.设置源点s到自己的最短路径为0,若存在有源点能够直接到达的顶点i则吧dis[i]设置为e[s][i].同时把所有其它不能直接到达的顶点的最短路径设置为∞ 3.在集合Q的所有顶点中选择一个离源点s最近的顶点u即dis[u]最小,加入到集合P.并考察所有以点u为起点地边,对每条边进行松弛操作. 4.重复第三

单源最短路-dijkstra算法(未优化)

1 bool used[maxn]; 2 int g[maxn][maxn]; // 边未联系的填充为INF 3 int d[maxn]; 4 void dijkstra(int s){ 5 memset(g,false,sizeof(g)); 6 memset(d,INF,sizeof(d)); 7 d[s] = 0; 8 while(1){ 9 int v = -1; 10 for(int u = 0; u<v; u++){ 11 if(!used[u] && (v == -1|

再看最短路算法 1 —— 单源最短路

学了多年的算法,最短路问题相当之常见———— 好久没写过最短路的问题了,直到昨天闲的无聊来了一题——BZOJ3402(HansBug:额才发现我弱到只能刷水的地步了TT) 一看这不是明显的单源最短路么呵呵...于是直接上来来了个dijkstra,而且用的是邻接表存储图—— Submit之后,结果却是—— 我立刻被雷到了QAQ...于是立刻改写spfa,结果—— 4000ms+(估计还不止)和192ms究竟是怎样的差距啊QAQ,本人虽然早都听说过spfa的强大性,但是未曾想过差距会如此可怕,于是H

利用无权图的单源最短路算法实现地铁换乘图

//Metro.php $MetroVertex = array( 1 => '体育中心', 2 => '体育西路', 3 => '杨箕', 4 => '东山口', 5 => '烈士陵园', 6 => '农讲所', 7 => '公园前', 8 => '西门口', 9 => '陈家祠', 10 => '长寿路', 11 => '黄沙', 12 => '芳村', 13 => '花地湾', 14 => '坑口', 15 =>

单源最短路 狄克斯特拉算法

一般形式的用邻接矩阵来实现dijkstra效率比较低,我这里直接记录的是用邻接表的方法以及用优先队列加以应用. 首先解释什么是dijkstra算法 dijkstra算法 dijkstra算法适用于求单源最短路,即可以求出起点到其余各点之间的最短路.它的算法实现是一个不断更新的过程. 举一个最简单的例子,假设有这么一个图,红色表示权值,黑色表示4个点以及路径,我们假设起点为1,用d[i]来表示1到i的最短路,那么在第一轮的时候,d[2]=1,d[3]=1,d[4]=5,再下一轮的时候会对这个情况进