[堆优化Dijkstra] 小木乃伊到我家

news/2024/5/19 6:24:47 标签: 图论, 堆排序, dijkstra

小木乃伊到我家 (nowcoder.com)icon-default.png?t=L9C2https://ac.nowcoder.com/acm/problem/15549

题目描述

  AA的欧尼酱qwb是个考古学家,有一天qwb发现了只白白圆圆小小的木乃伊,它是个爱哭鬼却很努力。qwb想把这么可爱的小木乃伊送给
AA,于是便找上了快递姐姐,这下可让快递姐姐犯愁了,因为去往AA家的路实在太难走了(甚至有可能没有路能走到AA家),快递姐姐
找上聪明的ACMer,想请你帮忙找出最快到达AA家的路,你行吗?

输入描述:

第一行输入两个整数n和m(2<=n<=m<=200000),分别表示有n座城市和m条路,城市编号为1~n(快递姐姐所在城市为1,AA所在城市为n)。
接下来m行,每行输入3个整数u,v,w(u,v<=n,w<=100000),分别表示城市u和城市v之间有一条长为w的路。

输出描述:

输出结果占一行,输出快递姐姐到达AA家最短需要走多远的路,如果没有路能走到AA家,则输出“qwb baka”(不用输出双引号)。

示例1

输入

4 4
1 2 1
2 3 2
3 4 3
2 3 1

 

输出

 

5

这题顶点数极大, 朴素dijkstra,spfa都过不去, 便采用了堆优化版dijkstra

牛客二星题也不好做啊...

#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

typedef pair<int, int> PII;

const int N = 1e6 + 10, INF = 0x3f3f3f3f;

int n, m;
int h[N], w[N], e[N], ne[N], idx;
int dist[N];
bool st[N];

void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}

int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, 1});

    while (heap.size())
    {
        auto t = heap.top();
        heap.pop();

        int ver = t.second, distance = t.first;

        if (st[ver]) continue;
        st[ver] = true;

        for (int i = h[ver]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (dist[j] > dist[ver] + w[i])
            {
                dist[j] = dist[ver] + w[i];
                heap.push({dist[j], j});
            }
        }
    }

    return dist[n];
}

int main()
{
    scanf("%d%d", &n, &m);

    memset(h, -1, sizeof h);
    while (m -- )
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        add(a, b, c),add(b, a, c);
    }

    int res = dijkstra();
    if(res == INF)
        cout << "qwb baka" << endl;
    else 
        cout << res << endl;
    return 0;
}


http://www.niftyadmin.cn/n/816585.html

相关文章

[D-OJ练习] (Dijkstra溯源)使用邻接矩阵实现有向图最短路径Dijkstra算法

嘿嘿,第一个AC ... 用邻接矩阵存储有向图&#xff0c;实现最短路径Dijkstra算法&#xff0c;图中边的权值为整型&#xff0c;顶点个数少于10个。 部分代码提示&#xff1a; #include <iostream> #include <string>using namespace std;const int MaxSize 10; cons…

[D-OJ练习] (★Prim路径输出)使用邻接矩阵实现最小生成树Prim算法

用邻接矩阵存储无向图&#xff0c;实现最小生成树Prim算法&#xff0c;图中边的权值为整型&#xff0c;顶点个数少于10个。 输入描述 首先输入图中顶点个数和边的条数&#xff1b; 再输入顶点的信息&#xff08;字符型&#xff09;&#xff1b; 再输入各边及其权值。 输出描述…

[牛客小\白月赛40] A, D, E, F, G, I

不是很理解CSDN连小白(标题违规???)都容不下了么 A数字游戏https://ac.nowcoder.com/acm/contest/11217/A用到了非递归快速幂(怕超时)和位运算 #include<stdio.h> typedef long long ll;ll Quick_pow(int a,int n) {int ans 1;while(n){if(n&1)ans * a;a * a;n …

染色法判定二分图, 二分图的最大匹配

染色法判定二分图 输入样例&#xff1a; 4 4 1 3 1 4 2 3 2 4输出样例&#xff1a; Yes #include <iostream> #include <cstring> #include <algorithm> using namespace std;const int N 1e510, M 2e520; int n,m; int h[N], e[M], ne[M], idx; int col…

[Java学习笔记] IO

总结自廖雪峰大佬的教程 Java教程 - 廖雪峰的官方网站 (liaoxuefeng.com)https://www.liaoxuefeng.com/wiki/1252599548343744 目录 File 练习:打印所有文件和子文件夹的内容 InputStream/OutputStream Filter模式(少量的类实现功能组合) File Java标准库的java.io.File对象表示…

[D-OJ练习] 使用邻接表实现AOV网的拓扑排序算法

输入描述 首先输入图中顶点个数和边的条数&#xff1b; 输入顶点的信息&#xff08;字符型&#xff09;&#xff1b; 输入各顶点的入度&#xff1b; 输入各边及其权值。 输出描述 输出AOV网的拓扑序列&#xff08;顶点信息&#xff09;&#xff0c;以空格隔开&#xff0c;最…

[PTA练习] 愿天下有情人都是失散多年的兄妹(25分)

呵呵。大家都知道五服以内不得通婚&#xff0c;即两个人最近的共同祖先如果在五代以内&#xff08;即本人、父母、祖父母、曾祖父母、高祖父母&#xff09;则不可通婚。本题就请你帮助一对有情人判断一下&#xff0c;他们究竟是否可以成婚&#xff1f; 输入格式&#xff1a; …

[PTA练习] (★还原树)完全二叉树的层序遍历 (25 分)

一个二叉树&#xff0c;如果每一个层的结点数都达到最大值&#xff0c;则这个二叉树就是完美二叉树。对于深度为 D 的&#xff0c;有 N 个结点的二叉树&#xff0c;若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点&#xff0c;这样的树就是完全二叉树。 给定一棵完全…