感觉自己太懒了,以后每天更博客激励自己吧。

//时间复杂度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最短路的更多相关文章

  1. Dijkstra最短路算法

    Dijkstra最短路算法 --转自啊哈磊[坐在马桶上看算法]算法7:Dijkstra最短路算法 上节我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最 ...

  2. dijkstra(最短路)和Prim(最小生成树)下的堆优化

    dijkstra(最短路)和Prim(最小生成树)下的堆优化 最小堆: down(i)[向下调整]:从第k层的点i开始向下操作,第k层的点与第k+1层的点(如果有)进行值大小的判断,如果父节点的值大于 ...

  3. 【坐在马桶上看算法】算法7:Dijkstra最短路算法

           上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径 ...

  4. 洛谷 P1529 回家 Bessie Come Home Label:Dijkstra最短路 && 乱搞

    题目描述 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰按响了电铃,所以她们开始向谷仓走去. 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛). 在挤奶 ...

  5. dijkstra 最短路算法

    最朴素的做法o(V*V/2+2E)~O(V^2)#include<iostream>using namespace std;#include<vector>#include&l ...

  6. Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)

    上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...

  7. TYVJ P1031 热浪 Label:dijkstra 最短路

    背景 USACO OCT09 9TH 描述 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer John此时以先 ...

  8. poj 3159 dijkstra 最短路

    Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the he ...

  9. 【啊哈!算法】算法7:Dijkstra最短路算法

    上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图 ...

  10. POJ3268 Silver Cow Party Dijkstra最短路

    Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to atten ...

随机推荐

  1. vs2017创建支持多框架(net4.6.1;net4.6.2;netstandard2.0;netcoreapp2.0)版本

    1.新建netcore或netstandard或net4.6.1项目 2.编辑项目文件: <Project Sdk="Microsoft.NET.Sdk">   < ...

  2. 从零开始学习cocoStudio(1)--cocoStudio是什么?

    一.cocoStudio是什么? CocoStudio是一套专业的永久免费的游戏开发工具集,帮助开发者快速创建游戏资源,将大部分繁琐的游戏开发工作使用编辑器来快速制作,CocoStudio包含了游戏开 ...

  3. datetime处理日期和时间

    datetime.now() # 获取当前datetimedatetime.utcnow() datetime(2017, 5, 23, 12, 20) # 用指定日期时间创建datetime 一.将 ...

  4. 【Hadoop学习之九】MapReduce案例分析一-天气

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 找出每个月气温最高的2天 1949 ...

  5. jfinal 项目 控制层、ORM层、AOP层,在发表之前一定要记得保存

    一.ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.简单的说,ORM是通过使用描述对象和数据 ...

  6. go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE

    go语言,golang学习笔记1 官网下载安装,中文社区,开发工具LiteIDE Go语言是谷歌2009发布的专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速 ...

  7. tomcat2章2

    package ex02.pyrmont1; import java.io.File; public class Constants { public static final String WEB_ ...

  8. Shell for while 循环

    li@ubuntu:~/test$ cat a.sh #!/bin/bash for loop in 1 2 3 4 5 do echo "The value is : $loop" ...

  9. 关于DNS 和根证书你了解多少?

    由于最近发生的一些事件,我们(Privacy Today 组织)感到有必要写一篇关于此事的短文.它适用于所有读者,因此它将保持简单 —— 技术细节可能会在稍后的文章发布. 什么是 DNS,为什么它与你 ...

  10. MyEclipse如何修改XML文件默认打开的编辑器

    1.MyEclipse如何修改XML文件默认打开的编辑器 Windows--->Preferences--->General--->Editors--->File Associ ...