正权图,貌似看来是一道裸的 \(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. Navicat工具链接 mysql"Access denied for user'root'@'IP'" 用户远程赋值

    如题 用Navicat远程连接数据库出现错误   给用户添加权限 连接MySQL mysql -uroot -p: use mysql; 更改权限 使用grant all privileges on来 ...

  2. Python 推导式详解

    各种推导式详解 推导式的套路 之前我们已经学习了最简单的列表推导式和生成器表达式.但是除此之外,其实还有字典推导式.集合推导式等等. 下面是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式. ...

  3. SpringMVC中静态资源的处理

    web项目中web.xml配置 在一个使用springmvc的web项目中,必然在web.xml中要配置前端控制器DispatcherServlet <servlet> <servl ...

  4. 三、Spring的@Scope设置组件作用域

    还是和上节一样,首先来看下配置类:MainConfig2 @Configuration 名 public class MainConfig2 { @Scope("singleton" ...

  5. Mysql中的读锁,写锁,乐观锁及事务隔离级别和并发问题

    mysql读锁,写锁,乐观锁 读锁,也叫共享锁(shared lock) SELECT * FROM table_name  WHERE ...  LOCK IN SHARE MODE 写锁,也叫排他 ...

  6. 设置Kafka集群的方法

    1.目标 今天,在这篇Kafka文章中,我们将看到Kafka Cluster Setup.这个Kafka集群教程为我们提供了一些设置Kafka集群的简单步骤.简而言之,为了实现Kafka服务的高可用性 ...

  7. linux根据进程名终止进程

    2017年09月25日 19:44:32 aladdin_sun 阅读数 5235   linux根据进程名终止进程 实验环境 操作系统:CentOS Linux release 7.3.1611 ( ...

  8. Linux下zookeeper单机版详细安装

    Linux下zookeeper单机版详细安装 1.zookeeper简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop ...

  9. 【C++札记】标准输入与输出

    概述 C语言中使用函数scanf和printf作为标准输入和输出,在C++中引入了类cin和cout进行标准输入和输出,所需头文件为<iostream>,命名空间是std.这里所说的标准输 ...

  10. javascript 代码实例

    数组去重 function unique(arr){ if(!Array.isArray(arr)){ console.log('type error!'); return; } arr = arr. ...