dijkstra最短路
感觉自己太懒了,以后每天更博客激励自己吧。 //时间复杂度O(n*n)的最短路算法
//首先需要设置一个访问数组v[maxn],一个数组d[maxn],
memset(v,,sizeof(v));
for(int i=;i<n;i++) d[i]=(i==?:inf);
for(int i=;i<n;i++)
{
for(int y=;y<n;y++)
{
int x,m=inf;
if(!v[y]&&d[y]<=m) m=d[x=y];
v[x]=;
for(int y=;y<n;y++)
if(d[y]>d[x]+w[x][y])
{
d[y]=d[x]+w[x][y];
fa[y]=x; //fa数组记录y节点的父节点,如果题目要求输出最短路路径,则顺着fa数组输出就可以了
}
//不要求输出最短路径时的另一种写法
//d[y]=min(d[y],d[x]+w[x][y]);只需要更新d[i]就可以了
}
} //时间复杂度为O(m*logn的算法)
//利用vector数组实现图的存储
//edges数组存储每条边的信息,G[i]存储从i号节点出发,
//思想,在原先O(n*n)算法当中,每次查找最小的d[i]点,都要for循环一遍花去大量的执行步骤
//所以现在用一个优先队列来保存每个节点到源点的距离d[i],每次都弹出最小的d[i]省去查找的时间
//此外借助广搜的思想,源节点先入队,然后它的每个子节点如果满足条件在队,每个节点都会最多被便利一次
//这对应了第一种朴素算法中的最外层for循环把每个节点都 遍历一遍
struct Edge{
int from,to,dist;
Edge(int u,int v,int d):from(u),to(v),dist(d) {};
};
struct Dijkstra()
{
int n,m;
vector<Edge> edges;
vector<int> G;
bool down[maxn];
int d[maxn];
int p[maxn];
void init()
{
for(int i=;i<n;i++)
G[i].clear();
edges.clear();
}
void AddEdge(int from,int to,int dist)
{
edges.push_back();//将边加入边集
m=edges.size;
G[from].push_back(m-);//由于下标是从零开始的,所以当加入以from开头的边时,这条边的编号为edges的大小-1 }
struct heapnode{
int d,u; //定义了每个节点的优先级比较方法,按照其离源点的距离,小的先输出
bool oprator <(const heapnode& rhs) const {
return d>rhs.d;
}
};
void dijkstra(int s)
{
priority_queue<heapnode> Q;
for(int i=;i<n;i++) //初始化每个点到源点的距离为无穷
d[i]=inf;
d[]=; //源点到自身的距离初始化为0;
memset(done,,sizeof(done));
Q.push((heapnode){,s});
while(!Q.empty())
{
heapnode x=Q.top();
Q.pop();
for(int i=;i<G[x.u].size;i++)
{
Edge& e=edges[G[x.u][i]];//G[i]数组保存的时i结点的各个边在e数组中对应的边号
if(d[e.to]>d[e.from]+e.dist)//如果到e.to有更短的路,则更新d数组
{
d[e.to]=d[e.from]+e.dist;
p[e.to]=G[x.u][i];//保存到当前节点e.to的最短路径的上一条边是谁
Q.push((heapnode){d[e.to],e.to});
}
}
}
}
}
dijkstra最短路的更多相关文章
- Dijkstra最短路算法
Dijkstra最短路算法 --转自啊哈磊[坐在马桶上看算法]算法7:Dijkstra最短路算法 上节我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最 ...
- dijkstra(最短路)和Prim(最小生成树)下的堆优化
dijkstra(最短路)和Prim(最小生成树)下的堆优化 最小堆: down(i)[向下调整]:从第k层的点i开始向下操作,第k层的点与第k+1层的点(如果有)进行值大小的判断,如果父节点的值大于 ...
- 【坐在马桶上看算法】算法7:Dijkstra最短路算法
上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径 ...
- 洛谷 P1529 回家 Bessie Come Home Label:Dijkstra最短路 && 乱搞
题目描述 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰按响了电铃,所以她们开始向谷仓走去. 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛). 在挤奶 ...
- dijkstra 最短路算法
最朴素的做法o(V*V/2+2E)~O(V^2)#include<iostream>using namespace std;#include<vector>#include&l ...
- Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)
上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...
- TYVJ P1031 热浪 Label:dijkstra 最短路
背景 USACO OCT09 9TH 描述 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer John此时以先 ...
- poj 3159 dijkstra 最短路
Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the he ...
- 【啊哈!算法】算法7:Dijkstra最短路算法
上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图 ...
- POJ3268 Silver Cow Party Dijkstra最短路
Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to atten ...
随机推荐
- Sublime text3 经常出现 “ There are no packages avaliable for installation” 解决方法
对应这个问题,一开始在度娘上找到很多答案,包括将json文件放在本地然后通过 package setting 更改的,发现其实不好使,原因未知. 后来测试了在hosts文件添加sublime text ...
- Mysql由浅入深
1. Mysql的安装方式 1. yum安装mysql 适合对数据库要求不太高的场合,例如:并发不大,公司内部,企业内部. 1. 官网下载yum源,wget https://dev.mysql.c ...
- jQuery-切换事件2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- PHP运行脚本
PHP运行脚本 php.exe -f "php文件" php.exe -r "php代码" 例如:在cmd中 C:\Users\Administrator.SK ...
- 永恒之蓝msf下 ms17_010 (64位kali下安装wine32)
本次用到的环境: kali(2016.2)32位系统.ip地址:192.168.1.104 目标靶机为:win7sp1x64系统(关闭防火墙),ip地址:192.168.1.105 ========= ...
- html5-绝对路径/相对路径
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- Java基础(basis)-----代码块详解
1.静态代码块 格式: static{ 内容..... } 随着类的加载而加载,而且只被加载一次 多个静态代码块之间按照顺序结构执行 优先其他各种代码块以及构造函数先执行 静态的代码块中只能执行静态的 ...
- 【Linux学习六】用户管理
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 一.增加删除用户或组新增用户useradd scott修改用户密码pa ...
- sklearn异常检测demo
sklearn 异常检测demo代码走读 # 0基础学python,读代码学习python组件api import time import numpy as np import matplotlib ...
- 自动添加菜品,加入运行中遇到的异常,生成日志文件...<工作中场景...>
""" 很弱智的小脚本,记录下.也许以后看到会笑,因为太幼稚或者证明曾经也努力过.so... """ """ ...