迪杰斯特拉算法(Dijkstra)
模板一:
时间复杂度O(n2)
int dijkstra(int s,int m) //s为起点,m为终点
{
memset(dist,,sizeof(dist)); //初始化,dist数组用来储存s到各个点的距离
memset(v,,sizeof(v)); //初始化v数组,是否已标记
for(int i=;i<=n;++i) //++i返回的是引用,稍微快一点
{
dist[i]=e[s][i]; //初始化,e[s][i]数组表示是点s到点i的权值,数组e用来存有向图或无向图的权值,用INF初始化
}
for(int i=;i<=n;++i)
{
k=INF,u=;
for(int j=;j<=n;++j) //找出当前dist最小的点
{
if(!v[j]&&dist[j]<k)
{
k=dist[j];
u=j;
}
}
v[u]=; //标记
for(int j=;j<=n;++j) //更新与点u相连的点的权值和
{
if(!v[j]&&e[u][j]<INF&&dist[u]+e[u][j]<dist[j]) //比较从点s到点u载到点j的权值和点s直接到点j的权值
{
dist[j]=dist[u]+e[u][j];
}
}
}
return dist[m];
}
模板二:
时间复杂度 O(mlogn)m为边数,n为顶点数。
对于稀疏图的效果显著,对稠密图慎用。
const int INF = 0x3f3f3f3f;
const int maxn = ;
struct Edge
{
int from, to, dist;
Edge(int u, int v, int d) :from(u), to(v), dist(d) {}
};
struct HeapNode
{
int d, u;
HeapNode(int D,int U):d(D),u(U){}
bool operator < (const HeapNode& rhs) const {
return d > rhs.d;
}
};
struct Dijkstra
{
int n, m;
vector<Edge> edges;
vector<int> G[maxn]; //maxn要大于顶点数
bool done[maxn];
int d[maxn];
int p[maxn]; void init(int n)
{
this->n = n;
for (int i = ; i < n; ++i)
G[i].clear();
edges.clear();
} void addEdge(int from, int to, int dist)
{
edges.push_back(Edge(from, to, dist));
m = edges.size();
G[from].push_back(m - );
} void dijkstra(int s, int kk) //s为起点 kk为终点
{
priority_queue<HeapNode> Q;
for (int i = ; i < n; ++i)
d[i] = INF;
d[s] = ;
memset(done, , sizeof(done));
Q.push(HeapNode( , s ));
while (!Q.empty())
{
HeapNode x = Q.top();
Q.pop();
int u = x.u;
if (u == kk) //到终点就退出
{
printf("%d\n", x.d);
break;
}
if (done[u])
{
continue;
}
done[u] = true;
for (int i = ; i < G[u].size(); ++i)
{
Edge& e = edges[G[u][i]];
if (d[u] + e.dist < d[e.to])
{
d[e.to] = d[u] + e.dist;
p[e.to] = G[u][i];
Q.push(HeapNode(d[e.to], e.to ));
}
}
}
} };
放一道模板题
http://acm.hdu.edu.cn/showproblem.php?pid=2544
AC代码
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = ;
struct Edge
{
int from, to, dist;
Edge(int u, int v, int d) :from(u), to(v), dist(d) {}
};
struct HeapNode
{
int d, u;
HeapNode(int D,int U):d(D),u(U){}
bool operator < (const HeapNode& rhs) const {
return d > rhs.d;
}
};
struct Dijkstra
{
int n, m;
vector<Edge> edges;
vector<int> G[maxn]; //maxn要大于顶点数
bool done[maxn];
int d[maxn];
int p[maxn]; void init(int n)
{
this->n = n;
for (int i = ; i < n; ++i)
G[i].clear();
edges.clear();
} void addEdge(int from, int to, int dist)
{
edges.push_back(Edge(from, to, dist));
m = edges.size();
G[from].push_back(m - );
} void dijkstra(int s, int kk) //s为起点 kk为终点
{
priority_queue<HeapNode> Q;
for (int i = ; i < n; ++i)
d[i] = INF;
d[s] = ;
memset(done, , sizeof(done));
Q.push(HeapNode( , s ));
while (!Q.empty())
{
HeapNode x = Q.top();
Q.pop();
int u = x.u;
if (u == kk)
{
printf("%d\n", x.d);
break;
}
if (done[u])
{
continue;
}
done[u] = true;
for (int i = ; i < G[u].size(); ++i)
{
Edge& e = edges[G[u][i]];
if (d[u] + e.dist < d[e.to])
{
d[e.to] = d[u] + e.dist;
p[e.to] = G[u][i];
Q.push(HeapNode(d[e.to], e.to ));
}
}
}
} };
int n, m, x, y, k;
Dijkstra d;
int main()
{
while (cin>>n>>m)
{
d.init(n);
if (n == && m == )
break;
while (m--)
{
cin >> x >> y >> k;
d.addEdge(x - , y - , k);
d.addEdge(y - , x - , k);
}
d.dijkstra(, n - );
}
return ;
}
持续更新……
迪杰斯特拉算法(Dijkstra)的更多相关文章
- 迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少
首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...
- C# 迪杰斯特拉算法 Dijkstra
什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...
- 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)
文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...
- 迪杰斯特拉算法dijkstra(可打印最短路径)
#include <iostream> #include <iomanip> #include <string> using namespace std; #def ...
- 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)
迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...
- dijkstra算法(迪杰斯特拉算法)
dijkstra算法(迪杰斯特拉算法) 用途:有向图最短路径问题 定义:迪杰斯特拉算法是典型的算法,一般的表述通常有两种方式,这里均采用永久和临时标号的方式,该算法要求图中不存在负权边 用永久和临时标 ...
- 理解最短路径——迪杰斯特拉(dijkstra)算法
原址地址:http://ibupu.link/?id=29 1. 迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...
- Dijkstra【迪杰斯特拉算法】
有关最短路径的最后一个算法——Dijkstra 迪杰斯特拉算法是由荷兰计算机科学家迪杰斯特拉于1959 年提出的,因此又叫迪杰斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...
- c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法
c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...
随机推荐
- 《剑指offer》面试题5 从尾到头打印链表 Java版
书中方法一:反转应该立刻想到栈,利用一个栈完成链表的反转打印,但是用了额外的O(n)空间. public void printFromTail(ListNode first){ Stack<Li ...
- [SOL] #148. 数字格子问题
说实话这题确实挺菜的... 废话少说,直接上代码^O^ Code: #include <bits/stdc++.h> using namespace std; inline int rea ...
- python的小介绍
Python简介 龟叔 优美.清晰.简单 主要应用领域: 云计算 WEB开发 科学技术.人工智能 系统运维 爬虫 金融量化分析 图形GUI 游戏 Python发展史 1989年,Guido开始写Pyt ...
- 图标,空格,大小尖括号,段落,换行,标题,div白板,span白板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JVM(1)之 JAVA栈
开发十年,就只剩下这套架构体系了! >>> 若想使自己编写的Java程序高效运行,以及进行正确.高效的异常诊断,JVM是不得不谈的一个话题.本"JVM进阶"专 ...
- 利用delegate来解决类之间相互引用问题(引用死锁)
类之间相互引用--类A中需要调用类B中的方法,同时,类B中又要调用类A中的方法.(也被称为引用死锁,通常会出现编译错误). 解决方法是,在类A中引用类B,并使类A成为类B的delegate,这样在类A ...
- PHP算法[转]
这里是用PHP写的几个基础算法,算法的重要性貌似对于PHP程序员不怎么重要,其实是非常重 要的,经典名句:算法+数据结构=程序.作为一名真正的高级PHP程序员,我认为应该熟悉C,如果你想成为真正的程序 ...
- ORA-01555 快照过旧
用户user1对表进行了更新操作,用户user2在user1还没有进行提交前读表中数据,而且是大批量的读取(打个比方:耗时3分钟)而在这3分钟内user1进行了提交操作,那又会产生什么影响呢?这个时候 ...
- pip安装依赖包
pip install -r requirements.txt setup.py 模块使用 https://blog.csdn.net/neil_pan/article/details/7900129 ...
- 微信小程序swiper组件实现图片宽度自适应
wxml 代码: <!--pages/swipe/swipe.wxml--> <view> <swiper circular="true" indic ...