Dijkstra+Heap模板
普通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 【模板】单源最短路径(标准版)
Dijkstra+Heap模板的更多相关文章
- 【CF20C】Dijkstra?(DIJKSTRA+HEAP)
没什么可以说的 做dijk+heap模板吧 以后考试时候看情况选择SFPA和DIJKSTRA ; ..]of longint; dis:..]of int64; a:..]of int64; b:.. ...
- hihocoder 1138 Islands Travel dijkstra+heap 难度:2
http://hihocoder.com/problemset/problem/1138 很久不用最短路,几乎连基本性质也忘了,结果这道题就是某些最短路算法空间复杂度是o(n) 这里总结四种算法 算法 ...
- 最短路径---dijkstra算法模板
dijkstra算法模板 http://acm.hdu.edu.cn/showproblem.php?pid=1874 #include<stdio.h> #include<stri ...
- 【最短路算法】Dijkstra+heap和SPFA的区别
单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...
- 图的最短路径算法Dijkstra算法模板
Dijkstra算法:伪代码 //G为图,一般设为全局变量,数组d[u]为原点到达个点的额最短路径, s为起点 Dijkstra(G, d[u], s){ 初始化: for (循环n次){ u = 是 ...
- [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 ...
- dijkstra算法模板及其用法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...
- hdu-2544-最短路(dijkstra算法模板)
题目链接 题意很清晰,入门级题目,适合各种模板,可用dijkstra, floyd, Bellman-ford, spfa Dijkstra链接 Floyd链接 Bellman-Ford链接 SPFA ...
- 【hdu 2544最短路】【Dijkstra算法模板题】
Dijkstra算法 分析 Dijkstra算法适用于边权为正的情况.它可用于计算正权图上的单源最短路( Single-Source Shortest Paths, SSSP) , 即从单个源点出发, ...
随机推荐
- php 判断图片文件的真实类型
/** * * 检测文件的真实类型 * * @param string $srcPath 文件路径 * * @return string $realType 文件真实类型 * */ $imgurl = ...
- linux安装6.5.3版本elastic search
到官网https://www.elastic.co/cn/downloads/elasticsearch下载压缩包,目前最新的版本是7.3.2,我想下6.5.3,点击下面的past release链接 ...
- Django ORM的继承关系
ORM中通常将对象引用映射到外键,但是对于继承,关系数据库中没有自然有效的方法来对应.从数据存储的角度来看,在映射继承关系时,可以采用几种方式(参考JPA中的InheritanceType.定义): ...
- 算法习题---5-8图书管理系统*****<双向迭代器>(UVa230)
一:题目 就是输入一系列书本名和作者名,然后输入命令模拟借书和还书,再输出归还的书的摆放位置.要求有两点: 需要对归还的书做特殊排序处理:作者名相同,则书本按书名从小到大排序:否则书本按作者名大小排序 ...
- 迅速解决!!!!!启动Tomcat报错PermGen space
启动Tomcat报错 PermGen space 内存溢出 解决方法:扩大tomcat内存 修改参数:set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSi ...
- Spring AOP无法拦截Controller
参考@参考文章中的评论 首先,应该打开aop代理 <aop:aspectj-autoproxy proxy-target-class="true"/> 其次,应该讲ao ...
- java 时间的原生操作和工具类操作
package com.xc.test.dateoperation; import org.apache.commons.lang3.time.DateFormatUtils; import org. ...
- python那些事儿
一.探索python 1.尝试安装python3 https://www.python.org/downloads/mac-osx/ 2.问题 安装了3.7,但是python -V还显示2.7.10. ...
- LODOP中table自动分页补线加border
LODOP中可以用ADD_PRINT_TABLE.ADD_PRINT_HTM.ADD_PRINT_HTML.ADD_PRINT_TBURL等可以输出超文本的表格,超文有超过打印项高度或纸张高度自动分页 ...
- [LeetCode] 849. Maximize Distance to Closest Person 最大化最近人的距离
In a row of seats, 1 represents a person sitting in that seat, and 0 represents that the seat is emp ...