堆优化Dijkstra计算最短路+路径计数
今天考试的时候遇到了一道题需要路径计数,然而蒟蒻从来没有做过,所以在考场上真的一脸懵逼。然后出题人NaVi_Awson说明天考试还会卡SPFA,吓得我赶紧又来学一波堆优化的Dijkstra(之前只会SPFA。。。
堆优化Dijkstra
其实Dijkstra的思想很简单。SPFA是以边为基础的最短路松弛,那么Dijkstra恰好相反,是以点为基础的最短路松弛。划分两个点的集合,一个是已经松弛的点集合,一个是未松弛的点集合,每次从已松弛的点集合中找当前路径最小的点来松弛与它相连的未松弛的点。但是如果是不加优化的Dijkstra复杂度是$O(n^2)$的,肯定会T,所以这里引入堆优化,复杂度可以降到$O((n+m)\log n)$。
路径计数
路径计数其实也很简单,在做最短路的时候多引入一个数组,表示当前从远点到达该点的最短路径条数。松弛的时候如果发现该点当前的最短路长度和它被松弛得到的长度相等,那么说明到达它的最短路径条数又增加了,那么就把该点的路径条数加上松弛点的路径条数;如果该点的最短路长度小于被松弛的长度,那么就更新最短路,同时更新路径条数,令该点的最短路径条数等于松弛点的路径条数。
最后再放上自己打的堆优化Dijkstra最短路+路径计数代码。
Code:
//It is made by HolseLee on 8th Aug 2018
//Dijkstra
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<queue>
using namespace std; const int mod=1e5+;
const int N=1e6+;
int n,m,sta,ed,dis[N],p[N],head[N],size;
bool vis[N];
struct Node{
int to,val,next;
}edge[N<<];
struct Cmp{
bool operator()(int a,int b){
return dis[a]>dis[b];
}
};
priority_queue<int,vector<int>,Cmp> t; inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
} inline void add(int x,int y,int z)
{
edge[++size].to=y;
edge[size].val=z;
edge[size].next=head[x];
head[x]=size;
} void dijkstra()
{
memset(vis,false,sizeof(false));
memset(dis,0x7f,sizeof(dis));
t.push(sta);
dis[sta]=;p[sta]=;
int x,y,z;
while(!t.empty()){
x=t.top();t.pop();
if(vis[x])continue;
vis[x]=true;
for(int i=head[x];i!=-;i=edge[i].next){
y=edge[i].to;
if(dis[y]==dis[x]+edge[i].val)
p[y]=(p[x]+p[y])%mod;
else if(dis[y]>dis[x]+edge[i].val){
dis[y]=dis[x]+edge[i].val;
p[y]=p[x];
t.push(y);
}
}
}
} int main()
{
n=read();m=read();
sta=read();ed=read();
memset(head,-,sizeof(head));
int x,y,z;
for(int i=;i<=m;++i){
x=read();y=read();z=read();
if(x==y)continue;
add(x,y,z);add(y,x,z);
}
dijkstra();
printf("%d %d",dis[ed],p[ed]);
return ;
}
堆优化Dijkstra计算最短路+路径计数的更多相关文章
- 【堆优化Dijkstra+字典序最短路方案】HDU1385-Minimum Transport Cost
[题目大意] 给出邻接矩阵以及到达各个点需要付出的代价(起点和终点没有代价),求出从给定起点到终点的最短路,并输出字典序最小的方案. [思路] 在堆优化Dijkstra中,用pre记录前驱.如果新方案 ...
- CodeForces - 449B 最短路(迪杰斯特拉+堆优化)判断最短路路径数
题意: 给出n个点m条公路k条铁路. 接下来m行 u v w //u->v 距离w 然后k行 v w //1->v 距离w 如果修建了铁路并不影响两点的最短距离, ...
- PAT-1030 Travel Plan (30 分) 最短路最小边权 堆优化dijkstra+DFS
PAT 1030 最短路最小边权 堆优化dijkstra+DFS 1030 Travel Plan (30 分) A traveler's map gives the distances betwee ...
- BZOJ 3040 最短路 (堆优化dijkstra)
这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...
- POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]
题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...
- BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
- 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra
题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...
- 【bzoj2259】[Oibh]新型计算机 堆优化Dijkstra
题目描述 Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题. 但是,有一个难题他却解决不了,是这台计算机的输入问题.新型计算机的输入也很独特,假设输入序列中有 ...
- 【bzoj4070】[Apio2015]雅加达的摩天楼 set+堆优化Dijkstra
题目描述 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 “doge” 的神秘生物 ...
随机推荐
- CSS盒子知识
此随笔写于学习完CSS盒子之后,所遇到的问题和感悟记录. 1.IE盒子: IE盒子的特性:对于IE浏览器来说width不是内容宽度.而是内容+外边距+边框的内容总和. 也就是说当盒子增加10px;那么 ...
- Python学习笔记(三十九)— 内置模块(8)XML基础
摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432002075 ...
- [php]require&require_once&include&include_once的用法与区别
1.require和include是php引入php文件的两种方式,使用格式如下: require(include) 文件名; require(include) 变量(此变量存储的是文件名); 2.区 ...
- 【BZOJ】2565: 最长双回文串
[题意]给定小写字母字符串s,求最长的 [ 可以分成左右两个回文串的 ] 子串,n<=10^5. [算法]回文树 [题解]对于每个字符x,处理出以x结尾的最长回文串,以x开头的最长回文串,然后枚 ...
- VC孙鑫老师第八课:你能捉到我吗?
第一步,首先在对话框窗口上放上两个一模一样的按钮控件 第二步,由于是按钮响应鼠标移动上去的事件,因此需要重新派生按钮类: 第三步,在窗口类中声明并使用自定义按钮对象(记得在窗口类中包含自定义按钮类的头 ...
- thinkphp博客项目纪录
项目地址:http://files.cnblogs.com/files/wordblog/blog.zip
- Mysql中的primary key 与auto_increment
mysql> create table cc(id int auto_increment); ERROR (): Incorrect table definition; there can be ...
- libuv 一 环境搭建, hello TTY
引言 - 一时心起, libuv linux 搭建 有一天突然想起来想写个动画. 找了一下 ui 库太大. 后面想起以前弄过的 libuv. 但发现 libuv 相关资料也很少. 所以就有了这些内容. ...
- groovy的三个强劲属性(一)Gpath
我们先从GPath开始,一个GPath是groovy代码的一个强劲对象导航的结构,名称的选择与XPath相似,XPath是一个用来描述XML(和等价物)文档的标准,正如XPath,GP ...
- oracle 一个网站
http://www.oracle.com/technetwork/cn/articles/11g-pivot-101924-zhs.html