普通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. Java基础 return 退出main方法的示例

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  2. Java基础 for 单层循环示例

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  3. pip安装各种模块

    date: 2019-08-20   19:27:09 pip install requests pip install xpinyin pip install redis

  4. mysql中int长度的意义 int(0)

    问题: mysql的字段,unsigned int(3), 和unsinged int(6), 能存储的数值范围是否相同.如果不同,分别是多大?int(0) 能存多少位数字? 不同,int(3)最多显 ...

  5. Ionic app IOS 在Xcode 模拟运行 真机调试

    1. 创建项目: sudo ionic start myApp tabs 2 cd 到刚才创建的项目 3. sudo ionic cordova platform add ios 把 ios 环境添加 ...

  6. android studio 把 ionic 打包时修改应用名称、修改应用图标、修改启动画面,升级打包

    在项目中resources中替换成自己的图标和启动画面即可 在config.xml 修改包名 打正式包和升级打包同原生的类似,在Androidmanifest.xml修改版本号和版本名

  7. 转 linux下ClamAV使用

    linux下ClamAV使用 第一步:Clamav下载http://www.clamav.net/downloads#yuminstall wget –y第二步:创建clamav用户和组groupad ...

  8. ABAP DEMO so批量导入

    *&---------------------------------------------------------------------* *& Report YDEMO_015 ...

  9. django 中单独执行py文件修改用户名

    Python文件代码 import os import django # 在environ字典里设置默认Django环境,'xxxx.settings'指Django项目的配置文件 os.enviro ...

  10. spring 理解Spring AOP 一个简单的约定游戏

    应该说AOP原理是Spring技术中最难理解的一个部分,而这个约定游戏也许会给你很多的帮助,通过这个约定游戏,就可以理解Spring AOP的含义和实现方法,也能帮助读者更好地运用Spring AOP ...