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) , 即从单个源点出发, ...
随机推荐
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_38、源码编译安装Redis4.x
笔记 2.源码编译安装Redis4.x 简介:使用源码安装Redis4.x和配置外网访问 1.快速安装 https://redis.io/download#installation ...
- Nginx之https配置 - 运维笔记 (http->https强转)
一.Nginx安装(略)安装的时候需要注意加上 --with-http_ssl_module,因为http_ssl_module不属于Nginx的基本模块.Nginx安装方法: # ./configu ...
- 004-行为型-06-命令模式(Command)
一.概述 是一种数据驱动的设计模式 请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令. 将请求封装成对象,以便使用不同的请 ...
- VMware Workstation 将虚拟机挂起后,电脑会很卡,SCSI转换成IDE就可以了
摘自:http://www.360doc.com/content/15/0405/09/10098873_460727712.shtml 用过 VMware Workstation 的人,不知道有没有 ...
- PAT 甲级 1070 Mooncake (25 分)(结构体排序,贪心,简单)
1070 Mooncake (25 分) Mooncake is a Chinese bakery product traditionally eaten during the Mid-Autum ...
- FreeMarker的应用场景
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一 ...
- 一个php创建webservice,并通过c#调用的真实实例(转)
https://www.cnblogs.com/sequh/archive/2015/09/18/4819832.html 最近需要用php创建webservice供C#和JAVA来调用,通过3天的搜 ...
- Sound (audio file) player in java - working source code example
转载自:http://ganeshtiwaridotcomdotnp.blogspot.com/2011/12/sound-audio-file-player-in-java-working.html ...
- angular2 ng-if
ng-if <td ><div class="td-li" > <a (click)="open(i)" class=" ...
- 设计模式之--Visitor
Ref: https://www.jianshu.com/p/feec47a25b67 https://www.cnblogs.com/alphablox/p/5346567.html