正权图,貌似看来是一道裸的 \(dijkstra\)

\(dijkstra\)的主要步骤:

首先,在\(dijkstra\)中,源点表示一开始的出发点,蓝点表示还未确定的点,白点则表示已经确定的点。

第一步先确定源点,有时候题目会告诉你。

接下来第二步,通过当前点去更新其能到的点的最短距离,并把其标记为白点。

第三步,在一遍扫完后再次寻找一个当前还没有被使用过且离源点最近的蓝点,做下一次更新。

\(dijkstra\)的模拟过程:

以下图为例:

一开始,所有点都是蓝点。\(dis[1]=0\),其余点均为 \(0x7f\)。

第一轮找到\(dis[1]\)最小,所以将\(1\)标为白点,得到新的\(dis[2]=2\),\(dis[3]=4\),\(dis[4]=7\)

第二轮找到\(dis[2]\)最小,所以将\(2\)标为白点,得到新的\(dis[3]=3\),\(dis[5]=4\)

第三轮找到\(dis[3]\)最小,所以将\(3\)标为白点,得到新的\(dis[4]=4\)

最后两轮循环再将点\(4\)和点\(5\)变成白点即可。

所以最后的\(dis\)数组:

\(dijkstra\)的程序实现:

本题最后要求出每个点到源点的最短距离,显然就是跑一遍\(dijkstra\)然后输出\(dis\)数组即可。

朴素算法因为每次都要查找当前离源点最近的蓝点,时间复杂度会达到\(n^2\),不能过本题的数据,但还是可以把这道题\(A\)掉的。

于是我们来思考如何优化,很容易想到的一种方法就是用一个优先队列维护当前所有点离源点的距离,每次弹出最短的,直到出现蓝点为止。这样就省去了\(O(n)\)的寻找,总时间复杂度\(O(n+m\) \(log\) \(n)\)。

结构体的比较注意重载小于运算符哦\(qwq\)。

\(Code:\)

#include<bits/stdc++.h>
using namespace std;
int n,m,s,dis[100010],vis[100010];
struct node{
int x,dis;
bool operator<(const node&a)const{//重载小于运算符
return dis>a.dis;
}
};
vector< pair<int,int> >next[100010];//存边
priority_queue<node>q;
void dijkstra(){
memset(dis,0x7f,sizeof(dis));//一开始所有值都设为最大值
dis[s]=0;
q.push({s,0});//源点
while(!q.empty()){
int Min=q.top().x;//每次弹出最短的
q.pop();//出队
if(vis[Min])continue;//不能是白点
vis[Min]=1;//标记
for(int i=0;i<next[Min].size();i++){
int Next=next[Min][i].first;////得到下一个点
int Nextw=next[Min][i].second;//得到边权
if(dis[Next]>dis[Min]+Nextw){
dis[Next]=dis[Min]+Nextw;//更新
q.push({Next,dis[Next]});//入队
}
}
}
}
int main(){
cin>>n>>m>>s;
for(int i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
next[x].push_back(make_pair(y,z));//连边
}
dijkstra();
for(int i=1;i<=n;i++){
cout<<dis[i]<<" ";
}
cout<<endl;
return 0;
}

\(\operatorname{Update}\) \(\operatorname{On}\) \(\operatorname{2019.08.27}\)

题解 洛谷P4779 【【模板】单源最短路径(标准版)】的更多相关文章

  1. 【洛谷 p3371】模板-单源最短路径(图论)

    题目:给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 解法:spfa算法. 1 #include<cstdio> 2 #include<cstdlib> 3 #in ...

  2. 洛谷P3371单源最短路径Dijkstra版(链式前向星处理)

    首先讲解一下链式前向星是什么.简单的来说就是用一个数组(用结构体来表示多个量)来存一张图,每一条边的出结点的编号都指向这条边同一出结点的另一个编号(怎么这么的绕) 如下面的程序就是存链式前向星.(不用 ...

  3. [模板]单源最短路径(Dijkstra)

    如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 主要还是再打一遍最短路,这种算法我用的不多... #include<bits/stdc++.h> using namesp ...

  4. 洛谷 P4779 【模板】单源最短路径(标准版) 题解

    P4779 [模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 100 ...

  5. 洛谷 P4779【模板】单源最短路径(标准版)

    洛谷 P4779[模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 10 ...

  6. 洛谷P4779 【模板】单源最短路径

    P4779 [模板]单源最短路径(标准版) 题目链接 https://www.luogu.org/problemnew/show/P4779 题目描述 给定一个 N个点,M条有向边的带非负权图,请你计 ...

  7. 洛谷 P3371 【模板】单源最短路径(弱化版) 题解

    P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...

  8. 洛谷P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 282通过 1.1K提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 不萌也是新,老司机求带 求看,spfa跑模板40分 为什么 ...

  9. 洛谷 P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...

随机推荐

  1. Python进阶之面向对象

    新式类与旧式类 区别: 在2.2版本之前所有的类都是旧式类,3.x版本已取消旧式类 旧式类一般的写法,不继承任何父类 class Person: def __init__(self, name): s ...

  2. 【CUDA开发】 Check failed: error == cudaSuccess (8 vs. 0) invalid device function

    最近在复现R-CNN一系列的实验时,配置代码环境真是花费了不少时间.由于对MATLAB不熟悉,实验采用的都是github上rbg大神的Python版本.在配置Faster R-CNN时,编译没有问题, ...

  3. javaScript Es6数组与对象的实例方法

     个人心得 我们在没有接触Es6方法之前,做一些算法之类的事情是就比较麻烦,在做的过程中也要考虑很多的问题,比较麻烦,而Es6的方法正是来方便我们在平常运用时能够将问题简便化,大大的减少我们的日常代码 ...

  4. 不借助其他任何软件防止QQ被盗的小技巧

    分享一个小技巧(防止QQ被盗号): 在登录的时候前面加个0,点击登录,如果显示账号不存在,是因为你没有在添加或注册账号这儿登录,也就是切换账号.PC端也可以,如下图:                 ...

  5. Linux中buff/cache内存占用过高解决办法

    在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个centos7的系统上,free命令的显示内容大概是这样一个状态: 这个命令几乎是每一个使用过Linux的人必会的命令,但越是 ...

  6. Java开发笔记(一百二十三)AWT图像视图

    前面介绍了AWT的几种基础控件,从按钮到文本标签,从输入框到选择框,无一例外都能显示文字,唯独无法显示某张图片文件.本以为AWT会提供专门的控件来显示图片,然而偏偏没有意料之中的图像控件,这可真是弱爆 ...

  7. quartz2.3.0(九)job任务监听器,监听任务执行前、后、取消手动处理方法

    job1任务类 package org.quartz.examples.example9; import java.util.Date; import org.quartz.Job; import o ...

  8. VS 引用dll版本冲突问题

    1.删除项目中的对应引用: 2.如果是有用到NetGet引用的删除项目中的packages里面的对应包文件: 3.如果是在NetGet中引用的注释项目中packages.config对应的插件名: 4 ...

  9. showModalDialog的使用方法

    基本介绍: showModalDialog()         (IE 4+ 支持) showModelessDialog()      (IE 5+ 支持) window.showModalDial ...

  10. 使用springboot实现一个简单的restful crud——01、项目简介以及创建项目

    前言 之前一段时间学习了一些springboot的一些基础使用方法和敲了一些例子,是时候写一个简单的crud来将之前学的东西做一个整合了 -- 一个员工列表的增删改查. 使用 restful api ...