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

//时间复杂度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. Hibernate框架的第四天

    ## Hibernate框架的第四天 ## ---------- **回顾:Hibernate框架的第三天** 1. 一对多关联关系映射 * JavaBean的编写 * 编写映射的配置文件 * 使用级 ...

  2. HDU 3117 Fibonacci Numbers(矩阵)

    Fibonacci Numbers [题目链接]Fibonacci Numbers [题目类型]矩阵 &题解: 后4位是矩阵快速幂求,前4位是用log加Fibonacci通项公式求,详见上一篇 ...

  3. Jenkins. 安装过程中出现一个错误: No such plugin: cloudbees-folder

    安装过程中出现一个错误: No such plugin: cloudbees-folder 安装插件,有时候会报类似的错误:An error occurred during installation: ...

  4. H5 dom元素保存为图片

    一.使用插件html2canvas:https://github.com/niklasvh/html2canvas 具体代码: 1.html <div class="test" ...

  5. JavaScript-合同到期续约案例

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. 4.无监督学习--K-means聚类

    K-means方法及其应用 1.K-means聚类算法简介: k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低.主要处理过程包括: 1.随机选择k个点作为 ...

  7. codeforces 980E The Number Games

    题意: 给出一棵树,要求去掉k个点,使得剩下的还是一棵树,并且要求Σ(2^i)最大,i是剩下的节点的编号. 思路: 要使得剩下的点的2的幂的和最大,那么肯定要保住大的点,这是贪心. 考虑去掉哪些点的话 ...

  8. Mysql Federated For Windows

    [1]windows环境下打开federated (1)关闭.命令:mysql> net stop mysql (2)添加federated字段.在my.ini文件中添加一个字段,注意位于[my ...

  9. Javascript深入理解构造函数和原型对象

    1.在典型的oop的语言中,如java,都存在类的概念,类就是对象的模板,对象就是类的实例.但在js中不存在类的概念,js不是基于类,而是通过构造函数(constructor)和原型链(propoty ...

  10. 51Nod 1069 Nim游戏 (位运算)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1069 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆 ...