dijkstra模板(好像是斐波那契额堆优化,但我为什么看起来像优先队列优化,和spfa一样)

/*
Dijkstra的算法思想:
在所有没有访问过的结点中选出dis(s,x)值最小的x
对从x出发的所有边(x,y),更新
dis(s,y)=min(dis(s,y),dis(s,x)+dis(x,y))
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int Ni = 10000;
const int INF = 0x3f3f3f3f;

struct node{
    int x,d;
    node(){}
    node(int a,int b){x=a;d=b;}
    bool operator < (const node & a) const
    {
        if(d==a.d) return x<a.x;
        else return d > a.d;
    }
};

vector<node> eg[Ni];
int dis[Ni],n;

void Dijkstra(int s)
{
    int i;
    memset(dis,INF,sizeof(dis));
    dis[s]=0;
    //用优先队列优化
    priority_queue<node> q;
    q.push(node(s,dis[s]));
    while(!q.empty())
    {
        node x=q.top();
        q.pop();
        for(i=0;i<eg[x.x].size();i++)
        {
            node y=eg[x.x][i];
            if(dis[y.x]>x.d+y.d)
            {
                dis[y.x]=x.d+y.d;
                q.push(node(y.x,dis[y.x]));
            }
        }
    }
}

int main()
{
    int a,b,d,m;
    while(scanf("%d%d",&n,&m),n+m)
    {
        for(int i=0;i<=n;i++)
            eg[i].clear();
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&d);
            eg[a].push_back(node(b,d));
            eg[b].push_back(node(a,d));
        }
        Dijkstra(1);
        printf("%d\n",dis[n]);
    }
    return 0;
}
/*
6 6
1 2 2
3 2 4
1 4 5
2 5 2
3 6 3
5 6 3
*/
时间: 2024-11-13 16:03:42

dijkstra模板(好像是斐波那契额堆优化,但我为什么看起来像优先队列优化,和spfa一样)的相关文章

斐波那契额序列

斐波那契额函数 import java.util.ArrayList; public class Fib { /*  * 斐波那契序列  * 递归  */ public static int fib(int n){ if(n<=0){ return 0; }else if(n==1){ return 1; }else{ return fib(n-1)+fib(n-2); } } /*  * 非递归  */ public static long ffib(int n,ArrayList<Long

python_实现_斐波那契额函数

在学递归的时候,用递归实现了一个 下面是代码 1 def fib(n): 2 if n >= 3: 3 return fib(n-1)+fib(n-2) 4 else: 5 return 1 6 print(fib(6)) 发现一个很严重的问题:当数字比较小的时候还好,但是当求30以后的数字的时候,就会运行特别长的时间 所以请看下面一种方法 1 while True: 2 def fib(n): 3 result = [1,1] 4 for i in range(n-2): 5 result.a

数论--斐波那契额

通项公式: 1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 int main() 5 { 6 double a,n,ans; 7 cin>>n; 8 //n--; //(第一项是0时) 9 a=sqrt(5); 10 ans =(a/5) * (pow( (1+a)/2 ,n) - pow((1-a)/2 ,n)); 11 cout<<ans; 12 return 0; 13 }

python的递归算法学习(2):具体实现:斐波那契和其中的陷阱

1.斐波那契 什么是斐波那契,斐波那契额就是一个序列的整数的排序,其定义如下: Fn = Fn-1 + Fn-2 with F0 = 0 and F1 = 1 也就是,0,1,1,2,3,5,8,13..... 递归实现: def fib(n): if n == 0: return 0 elif n == 1: return 1 else: return fib(n-1) + fib(n-2) 非递归实现: def fibi(n): a, b = 0, 1 for i in range(n):

上楼梯问题,斐波那契数列

问题描述: 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或者二级,要走上m级,共有多少走法?注:规定从一级到一级有0种走法.给定一个正整数int n,请返回一个数,代表上楼的方式数.保证n小于等于100.为了防止溢出,请返回结果Mod 1000000007的值. 算法思路:这道题其实就是斐波那契数列的应用,因为可以走一步,又可以走两步,开始在第一层台阶.所以,上第二层台阶,有1种方法,上第三层台阶,有2种方法,上后一层,可以通过前一层再走1步,前两层再走2步.所以,就是f(x)= f(

递归和尾递归的比较,斐波那契

相信如果一个人让我们求一个斐波那契数列,如果你学过c语言,你一定会说用递归法啊,很容易就实现了,但是如果人家让你求斐波那契的第50个数,而且你对递归了解的话,估计帮你不会说递归了,如果了解够深的话,其实你会说递归也可以求出来. 1.递归 首先我们来说说什么是递归,简单的来说,就是一个函数需要调用自己来完成某种功能,这种调用就叫做递归. 但我们需要清楚一点,递归在使用的时候,并不是一直调用自己,我们需要给他一个停下来的时机.就像打仗一样,要知道进攻的路线,但如果遇到突发状况也要能及时撤退.所以我们

算法导论第十九章 斐波那契堆

<算法导论>第二版中在讨论斐波那契堆之前还讨论了二项堆,但是第三版中已经把这块的内容放到思考题中,究极原因我想大概是二项堆只是个引子,目的是为了引出斐波那契堆,便于理解,而且许多经典的算法实现都是基于斐波那契堆,譬如计算最小生成树问题和寻找单源最短路径问题等,此时再把二项堆单独作为一章来讲显然没有必要.类似的堆结构还有很多,如左倾堆,斜堆,二项堆等,下次我打算开一篇博客来记录下它们的异同点. 一.摊还分析(第十七章) 这些高级的数据结构的性能分析一般是基于一个技术——摊还分析,可以理解成一种时

斐波那契数列F(n)【n超大时的(矩阵加速运算) 模板】

hihocoder #1143 : 骨牌覆盖问题·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 骨牌,一种古老的玩具.今天我们要研究的是骨牌的覆盖问题: 我们有一个2xN的长条形棋盘,然后用1x2的骨牌去覆盖整个棋盘.对于这个棋盘,一共有多少种不同的覆盖方法呢? 举个例子,对于长度为1到3的棋盘,我们有下面几种覆盖方式: 提示:骨牌覆盖 提示:如何快速计算结果 输入 第1行:1个整数N.表示棋盘长度.1≤N≤100,000,000 输出 第1行:1个整数,表示

[模板]矩阵乘法(斐波那契数列)

洛谷P1962 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请你求出 f(n) mod 1000000007 的值. 输入输出格式 输入格式: ·第 1 行:一个整数 n 输出格式: 第 1 行: f(n) mod 1000000007 的值 输入输出样例 输入样例#1: 5 输出样例#1: 5 输入样例#2: 10 输出样例#2: 55 说明