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) , 即从单个源点出发, ...
随机推荐
- [原][工具][global mapper]查看图元属性(查看shp文件属性值)
常用的shp文件需要查看其内部字段 目前常用的有三种方法: 1.使用excel打开dbf文件,直接查看shp数据库文本文件 2.使用global mapper查看shp图元,然后通过内部工具查看“图元 ...
- ISO/IEC 9899:2011 条款5——5.2 环境上的考虑
5.2 环境上的考虑 5.2.1 字符集 5.2.2 字符显示语义 5.2.3 信号与中断 5.2.4 环境限制
- postgresql 所有聚合函数整理
SELECT DISTINCT(proname) FROM pg_proc WHERE proisagg order by proname 查所有 SELECT * FROM pg_proc WHER ...
- 前端速查手册——Note
目录 自定义弹框(模块框) HTML5新增标签 HTML5新增属性 自定义弹框(模块框) HTML <div style="display:none" id="mo ...
- ROS学习笔记(二)
===================================================== QT工具箱sudo apt-get install ros-kinetic-rqtsudo ...
- Qt编写气体安全管理系统13-短信告警
一.前言 短信告警这个模块在很多项目中都用上了,比如之前做过的安防系统,温湿度报警系统等,主要的流程就是收到数据判断属于某种报警后,组织短信字符串内容,发送到指定的多个手机号码上面,使用的是短信猫硬件 ...
- python locust--Setups, Teardowns, on_start, and on_stop .
创建一个locust测试脚本,如下: from locust import HttpLocust, TaskSet, task class UserBehavior(TaskSet): def set ...
- Java Audio : Playing PCM amplitude Array
转载自:http://ganeshtiwaridotcomdotnp.blogspot.com/2011/12/java-audio-playing-pcm-amplitude-array.html ...
- ubuntu18.04安装DB2 11.1 Express-c
参考连接:https://developer.ibm.com/answers/questions/280797/download-db2-express-c-105-1/ 这个参考页面提供了DB2 E ...
- C#自带的Version判断版本号的大小
Version version1 = new Version("1.0.0.25"); Version version2 = new Version("1.0.0.24& ...