【一个蒟蒻的挣扎】单源最短路(Dijkstra)

赛前没啥时间好好解释了,还有三天2019CSP,大家加油啊!!!

ヾ(?°∇°?)??

背掉它就好啦!!!

我觉得我这一版打得还行就放上来了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
#include<vector>
using namespace std;
int n,m,s;
int dis[10001],first[10001];
inline void read(int &x)
{
    char c=getchar();
    int flag=1; x=0;
    while (c<‘0‘||c>‘9‘)
    {
        if (c==‘-‘) flag=-1;
        c=getchar();
    }
    while (c>=‘0‘&&c<=‘9‘)
    {
        x=x*10+c-‘0‘;
        c=getchar();
    }
    x*=flag;
}
struct edge
{
    int next,to,v;
    edge()
    {
    }
    edge(int a,int b,int c)
    {
        next=a; to=b; v=c;
    }
}E[10004];
struct heap
{
    int to,v;
    heap()
    {
    }
    heap(int a,int b)
    {
        to=a; v=b;
    }
};
priority_queue<heap> h;
inline bool operator < (const heap &a,const heap &b)
{
    return a.v>b.v;
}
int tot;
void add_to_edge(int a,int b,int c)
{
    E[++tot]=edge(first[a],b,c);
     first[a]=tot;
}
void add_to_heap(int p)
{
    for (int i=first[p]; i; i=E[i].next)
    {
        if (dis[E[i].to]==-1)
        h.push(heap(E[i].to,dis[p]+E[i].v));
    }
}
void dijkstra(int s)
{
    while (!h.empty())
    {
        h.pop();
    }
    memset(dis,-1,sizeof(dis));
    dis[s]=0;
    add_to_heap(s);
    while (!h.empty())
    {
        if (dis[h.top().to]!=-1)
        {
            h.pop();
            continue;
        }
        int p=h.top().to;
        dis[p]=h.top().v;
        h.pop();
        add_to_heap(p);
    }
}
int main()
{
    read(n); read(m); read(s);
    for (int i=1; i<=m; i++)
    {
        int x,y,z;
        read(x); read(y); read(z);
        add_to_edge(x,y,z);
    }
    dijkstra(s);
    for (int i=1; i<=n; i++)
    cout<<dis[i]<<" ";
    return 0;
}

2019CSP-S    RP+++++

原文地址:https://www.cnblogs.com/Phantomhive/p/11844451.html

时间: 2024-08-01 17:09:33

【一个蒟蒻的挣扎】单源最短路(Dijkstra)的相关文章

利用分支限界法求解单源最短路(Dijkstra)问题

分支限界法定义:采用BFS算法,并使用剪枝函数的算法称为分支界限法. 分支限界法解释:按广度优先的原则,有选择的在其child中进行扩展,从而舍弃不含有最优解的分支,不断重复这一过程,直到找到答案或者判定无解. 分支界限法常常用到优先队列来选择最佳扩展节点,有时也会用到普通队列,以先进先出为原则来进行筛选. 单源最短路问题定义:给定有向图和起点,寻找到达所有点的最短路径. 单源最短路的分支限界法概述:首先把节点加入优先队列,之后不断地从队列中取出最优扩展点,观察其可抵达的所有目标节点,若当前路径

【一个蒟蒻的挣扎】模拟赛2解题报告

---恢复内容开始--- 今天50分,我自闭 眼瞎看错了一道题,然后两道题的代码都出了点小毛病,自闭 真的竞赛我要这样可以收拾收拾退役了真的,眼睛不能这么瞎了考试莫得人帮忙改了 如果一切都没问题今天应该有130,啊!!!!!!!!!!!!!!!!! 今天两题可以用堆,一题模拟随便写写就过了,(所以我为什么考这么差) 进入正题 题目一览(其实就3道题)(CZR到底是谁这么爱数学和折磨我们) 24点 小游戏 中位数 题1. 24点 题目描述 1.1 Background CZR很喜欢学数学,但是他数

【一个蒟蒻的挣扎】简单算法

济南DAY1内容,老师讲的非常慢非常细(好容易懂de) 基本原理我就不写啦,这里只是记录一下一些例题 看看例题写写例题,OK 二分 [NKOI]循环赛日程表 二分查找 时间复杂度不超过O(log 2^n) [NKOI3592]人数统计 给出每个同学过题量和m个询问,求每个过题量k有几个 二分查找,L始终指向最左(右)边的k,求出区间后相减,就是答案. 二分快速幂 时间复杂度O(log b) 模板自己想啦 二分答案 跳石头[洛谷P2678] 贪心 方格取数 任务调度问题 分糖果 搜索 健康的荷斯坦

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

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

单源最短路-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|

图论:单源最短路与多源最短路问题

转载自http://acm.uestc.edu.cn/bbs/read.php?tid=5670 下载ppt帐号:qscqesze 密码:123456 ------------------------------------------------------------------- 单源最短路径: 松弛操作:D[i]表示源点s到i的当前最短路径1.条件:d[i]+e[i][j]<d[j]2.更新:d[j]=d[i]+e[i][j] Dijkstra算法: 算法初始时d[s] = 0,其余的点

记一个蒟蒻的绝望

感觉现在…… 怎么讲,心挺冷的. 今天一月五号了.距离省选,时间好短啊. 我还有那么多东西不懂.甚至听都没听说过. 等到真正去省选的时候,我可能跟现在一样,什么都不会. 我的名字能不能被看到都不知道.哈,还进队呢. …… 我NOIP似乎考的很好.然而首先我只有24名,其次我实力到不了420. 我D2T2打的是状压贪心.rqy和gc回来的路上告诉我,我那个DP,显而易见是没有考虑周全的. 所以我实力大概是320分.320分,能做得了什么? …… zht说自己现在省选没可能的.四月差不多可以. 我四

noip2013Day2T3-华容道【一个蒟蒻的详细题解】

描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的: 在一个 n*m 棋盘上有 n*m 个格子,其中有且只有一个格子是空白的,其余 n*m-1个格子上每个格子上有一个棋子,每个棋子的大小都是 1*1 的: 有些棋子是固定的,有些棋子则是可以移动的: 任何与空白的格子相邻(有公共的边)的格子上的棋子都可以移动到空白

Dijkstra算法(求解单源最短路)详解 + 变形 之 poj 1860 Currency Exchange

/* 求解单源最短路问题:Dijkstra算法(该图所有边的权值非负) 关键(贪心): (1)找到最短距离已经确定的节点,从它出发更新与其相邻节点的最短距离: (2)此后不再关心(1)中“最短距离已经确定的节点”. 时间复杂度(大概的分析,不准确): “找到最短距离已经确定的节点” => O(|V|) "从它出发更新与其相邻节点的最短距离" => 邻接矩阵:O(|V|),邻接表:O(|E|) 需要循环以上两个步骤V次,所以时间复杂度:O(V^2) 即:在|E|较小的情况下,