今天考试的时候遇到了一道题需要路径计数,然而蒟蒻从来没有做过,所以在考场上真的一脸懵逼。然后出题人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计算最短路+路径计数的更多相关文章

  1. 【堆优化Dijkstra+字典序最短路方案】HDU1385-Minimum Transport Cost

    [题目大意] 给出邻接矩阵以及到达各个点需要付出的代价(起点和终点没有代价),求出从给定起点到终点的最短路,并输出字典序最小的方案. [思路] 在堆优化Dijkstra中,用pre记录前驱.如果新方案 ...

  2. CodeForces - 449B 最短路(迪杰斯特拉+堆优化)判断最短路路径数

    题意: 给出n个点m条公路k条铁路. 接下来m行 u v w      //u->v 距离w 然后k行 v w         //1->v 距离w 如果修建了铁路并不影响两点的最短距离, ...

  3. PAT-1030 Travel Plan (30 分) 最短路最小边权 堆优化dijkstra+DFS

    PAT 1030 最短路最小边权 堆优化dijkstra+DFS 1030 Travel Plan (30 分) A traveler's map gives the distances betwee ...

  4. BZOJ 3040 最短路 (堆优化dijkstra)

    这题不是裸的最短路么?但是一看数据范围就傻了.点数10^6,边数10^7.这个spfa就别想了(本来spfa就是相当不靠谱的玩意),看来是要用堆优化dijkstra了.但是,平时写dijkstra时为 ...

  5. POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...

  6. BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra

    题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...

  7. 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra

    题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...

  8. 【bzoj2259】[Oibh]新型计算机 堆优化Dijkstra

    题目描述 Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题. 但是,有一个难题他却解决不了,是这台计算机的输入问题.新型计算机的输入也很独特,假设输入序列中有 ...

  9. 【bzoj4070】[Apio2015]雅加达的摩天楼 set+堆优化Dijkstra

    题目描述 印尼首都雅加达市有 N 座摩天楼,它们排列成一条直线,我们从左到右依次将它们编号为 0 到 N−1.除了这 N 座摩天楼外,雅加达市没有其他摩天楼. 有 M 只叫做 “doge” 的神秘生物 ...

随机推荐

  1. 转:Unable to execute dex: Multiple dex files define 解决方法

    转自:http://blog.csdn.net/mxlxiao7/article/details/8978930 问题发生概述: 程序编译正常,在用Eclipse调试执行时,报错Unable to e ...

  2. [LeetCode] 24. Swap Nodes in Pairs ☆

    Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2-& ...

  3. HDU 2827 高斯消元

    模板的高斯消元.... /** @Date : 2017-09-26 18:05:03 * @FileName: HDU 2827 高斯消元.cpp * @Platform: Windows * @A ...

  4. Elasticsearch Java API 配置测试

    Elasticsearch1.X,2.X,5.X随着版本的迭代,除了系统升级,Java API也做了相对较大的调整,也就是说,1.X的API在2.X以及5.X乃至未来6.X版本都不是通用的. 本例子使 ...

  5. display:inline-block之用法

    HTML的元素有多种display属性,比较常见的有display:none; display:block; display:inline和display:inline-block;等.详细可参阅W3 ...

  6. HttpClient 模拟登陆知乎

    最近做爬虫相关工作,我们平时用HttpWebRequest 比较多,每一个Url都要创建一个HttpWebRequest实例, 而且有些网站验证比较复杂,在登陆及后续抓取数据的时候,每次请求需要把上次 ...

  7. [csp-201809-3]元素选择器-编译原理

    声明:同样是参考照抄hyh学长的代码!(有问题我马上删这篇emm 题目链接:http://118.190.20.162/view.page?gpid=T77 题面: 这棵树的样子(同样是来自学长的图) ...

  8. 蓝色的oa模板html_综合信息服务管理平台OA模板——后台

    链接:http://pan.baidu.com/s/1qXGGOAK 密码:2otu

  9. Callback2.0

    Callback定义? a callback is a piece of executable code that is passed as an argument to other code, wh ...

  10. isolation forest进行异常点检测

    一.简介 孤立森林(Isolation Forest)是另外一种高效的异常检测算法,它和随机森林类似,但每次选择划分属性和划分点(值)时都是随机的,而不是根据信息增益或者基尼指数来选择.在建树过程中, ...