普通Dijkstra:

 void DijkstraPath(int v0,int vis[],int dist[],int path[])
{
int onePath[maxn];
int d;
int k;
for(int i = ;i < n;i++)
{
if( vis[i] && i != v0)
{
cout<<"Path->";
d = ;
onePath[d] = i;//添加路径上的终点
k = path[i];
if(k == -)
{
cout<<"No paht"<<endl;
}
else
{
while(k != v0)
{
d++;
onePath[d] = k;
k = path[k];
}
d++;
onePath[d] = v0;//添加起点
cout<<"Start :"<<onePath[d];//起点
for(int j = d - ;j>=;j--)
{
cout<<onePath[j]<<" ";
}
cout<<endl;
}
}
}
} void Dijkstra(int v0)
{
int dist[maxn];//距离数组,每个点到v0的直接距离
int path[maxn];//路径数组,记录最短路径上的前驱结点
int vis[maxn];
int u;//中间结点
memset(dist,,sizeof(dist));
memset(path,,sizeof(path));
memset(vis,,sizeof(vis));
int mindist;
for(int i = ;i < n;i++)
{
dist[i] = Graph[v0][i];
if(Graph[v0][i] < INF)
{
path[i] = v0;//开始与v0直连的点记录
}
else
{
path[i] = -;
}
}
vis[v0] = ;//开始时v0加入最短路中
path[v0] = ;
for(int i = ; i < n-;i++)
{
mindist = INF;
for(int j = ;j < n;j++)
{
if( !(vis[i]) && dist[j] < mindist)//找最短路
{
mindist = dist[j];
u = j;
}
}
vis[u] = ;
for(int i = ; i < n;i++)//路径更新
{
if( !(vis[i]))////考虑剩下未访问的边
{
if( Graph[u][i] < INF && dist[i] > dist[u] + Graph[u][i] )
//中间点的总路程比原来能直达的更短
{
dist[i] = dist[u] + Graph[u][i];
path[i] = u;//更新前驱结点
}
}
}
}
//DijkstraPath( v0, vis,dist,path);//输入最短路径
}

优化后:

 const int maxn= ;
int n;
int m;
int p;
int cnt;
int dist[];
int head[];//init -1
//存放以i为起点的第一条边存储的位置//以i为起点最后的那个编号
int point[]; struct Edge//建图
{
int v;//edge[i]表示第i条边的终点
int w;//edge[i]表示第i条边的权值 即 距离
int nxt;//edge[i]表示与第i条边同起点的下一条边的存储位置(上一条边)
}edge[maxn]; void Add(int x,int y,int w)// x -> y == w
{//链式向前星
edge[++cnt].v = y;
edge[cnt].w = w;
edge[cnt].nxt = head[x];
head[x] = cnt;
} struct node
{
int u;
int d;
bool operator< (const node& rhs)const
{
return d >rhs.d;
}
}; void Dijkstra(int s)
{
for(int i=;i<=n;i++)
dist[i] = (i==s)? :;
priority_queue<node> Q;
Q.push((node){s,});//开始结点进队
while (!Q.empty())
{
node fr = Q.top(); Q.pop();
int u = fr.u;//2,0
int d = fr.d;
// cout<<"enqueue:u:"<<u<<" d:"<<d<<endl;
// cout<<"~~~";
if (d != dist[u]) continue;//dijkstra中每个点只会出队一次 vis
for (int i = head[u];i;i=edge[i].nxt)
{
// cout<<"i =="<<i<<endl;
int v = edge[i].v;//第i条边的终点
// cout<<"edge["<<i<<"].v :"<<v<<" ";
int w = edge[i].w;
// cout<<"edge["<<i<<"].w :"<<w<<" ";
// cout<<endl<<"~~~~~~~~~~~"<<endl;
if (dist[u]+w < dist[v])
{
// cout<<"dist["<<v<<"]"<<dist[v]<<" "<<endl;
/// cout<<"dist["<<u<<"] + w :"<<dist[u]+w<<endl;
// cout<<"~~~~~~~~~"<<endl;
dist[v] = dist[u]+w;
// cout<<"dist["<<v<<"] = "<<dist[u]+w<<endl;
// cout<<v<<"v,dist["<<v<<"] enqueue"<<endl;
Q.push((node){v,dist[v]});
}
}
}
}
int main()
{
cin>>n>>m>>p;//p为特殊点
memset(point,,sizeof(point));
memset(head,-,sizeof(head));
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
Add(x,y,z);
}
//cout<<"~~~~~~~~~~~~~"<<endl;
// for(int i = 1;i <= m;i++)
// {
// cout<<" head["<<i<<"]"<<head[i]<<" ||";
// cout<<"edge["<<i<<"] ="<<edge[i].v<<" next"<<edge[i].nxt<<endl;
// }
// cout<<"~~~~~~~~~~~~~~~~~~~~~"<<endl;
Dijkstra(p);//p 到其他点的最小距离
...
....
return ;
}

以下题目可以拿来练练手,几乎是基本模板题

P3371 【模板】单源最短路径(弱化版)

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

Silver Cow Party

 
 

Dijkstra+Heap模板的更多相关文章

  1. 【CF20C】Dijkstra?(DIJKSTRA+HEAP)

    没什么可以说的 做dijk+heap模板吧 以后考试时候看情况选择SFPA和DIJKSTRA ; ..]of longint; dis:..]of int64; a:..]of int64; b:.. ...

  2. hihocoder 1138 Islands Travel dijkstra+heap 难度:2

    http://hihocoder.com/problemset/problem/1138 很久不用最短路,几乎连基本性质也忘了,结果这道题就是某些最短路算法空间复杂度是o(n) 这里总结四种算法 算法 ...

  3. 最短路径---dijkstra算法模板

    dijkstra算法模板 http://acm.hdu.edu.cn/showproblem.php?pid=1874 #include<stdio.h> #include<stri ...

  4. 【最短路算法】Dijkstra+heap和SPFA的区别

    单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...

  5. 图的最短路径算法Dijkstra算法模板

    Dijkstra算法:伪代码 //G为图,一般设为全局变量,数组d[u]为原点到达个点的额最短路径, s为起点 Dijkstra(G, d[u], s){ 初始化: for (循环n次){ u = 是 ...

  6. [dijkstra+heap优化] 模板

    var n,m,s,i,j,x,y,z,l,tot :longint; pre,last,other,len :..] of longint; heap,d,pl :Array[..] of long ...

  7. dijkstra算法模板及其用法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  8. hdu-2544-最短路(dijkstra算法模板)

    题目链接 题意很清晰,入门级题目,适合各种模板,可用dijkstra, floyd, Bellman-ford, spfa Dijkstra链接 Floyd链接 Bellman-Ford链接 SPFA ...

  9. 【hdu 2544最短路】【Dijkstra算法模板题】

    Dijkstra算法 分析 Dijkstra算法适用于边权为正的情况.它可用于计算正权图上的单源最短路( Single-Source Shortest Paths, SSSP) , 即从单个源点出发, ...

随机推荐

  1. shell脚本将gbk文件转化为utf-8

    使用注意项: 原来文件格式gbk的,否则可能出现utf-8转utf-8乱码. #!/bin/bash function gbk2utf(){ file="$1" echo &quo ...

  2. springboot mybatis的pagehelper分页

    maven repositary里,分页组件常用的有两个 com.github.pagehelper » pagehelper-spring-boot-starter  com.github.page ...

  3. training 2

    Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.136 Average Precision (AP) @[ IoU ...

  4. 用KNN实现iris的4分类问题&测试精度

    import matplotlib.pyplot as plt from scipy import sparse import numpy as np import matplotlib as mt ...

  5. 网络编程之Reactor 模式

    基本的架构是 epoll+线程池. 这篇博文主要从以下几个方面进行阐述: (1)reactor模式的一个介绍:(只要是我的理解) (2)关于线程池的说明. (3)如何将epoll + 池结合起来实现一 ...

  6. Dockerfile构建nginx镜像

    Dockerfile构建nginx镜像 [root@bogon ~]# mkdir /opt/docker-file [root@bogon ~]# cd /opt/docker-file/ [roo ...

  7. 如何修改WAMPServer默认的网站路径地址

    通常,我们安装WAMPServer集成的PHP开发环境之后,默认的网站路径地址是其安装目录下子文件夹:"wamp/www/".那么我们怎么修改网站地址到自己指定的路径呢?本篇经验将 ...

  8. AWS 消息服务(九)

    松耦合架构 概述 使用独立的组件设计架构,降低相互依赖,当一个组件出现故障时,其他不受影响 利用ELB和SQS来打破传统服务器各层的关联,成为各层之间的中介,各层的故障和扩展均由中介自助处理 系统的耦 ...

  9. JavaFX窗体设置无边框

    public void start(Stage stage) throws Exception { longStart(); Parent root = FXMLLoader.load(getClas ...

  10. 计算机视觉/图像处理工具箱推荐(转自cvnote)

    最近在几个地方都看到有人问C++下用什么矩阵运算库比较好,顺便做了个调查,做一些相关的推荐吧.主要针对稠密矩阵,有时间会再写一个稀疏矩阵的推荐. Armadillo:C++下的Matlab替代品 地址 ...