首页 > 其他分享 >spfa求最短路——BFS,数组实现邻接表,数组实现队列

spfa求最短路——BFS,数组实现邻接表,数组实现队列

时间:2023-04-10 14:35:00浏览次数:51  
标签:node dist int tt BFS spfa 数组 foot 号点

题目描述

题目来源 AcWing

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出impossible
数据保证不存在负权回路。
输入格式
第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式
输出一个整数,表示 1号点到 n 号点的最短距离。

如果路径不存在,则输出 impossible

数据范围
\(1≤n,m≤10^5,\)
图中涉及边长绝对值均不超过 10000。
输入样例

3 3
1 2 5
2 3 -3
1 3 4

输出样例

2

代码

#include <iostream>
#include <fstream>
#include <cstring>
#include <memory>

using namespace std;

static const int N = 1e5 + 5;
static int idx = 1, e[N], ne[N], h[N], w[N], dist[N], que[N];
static bool foot[N];

/**
 * @brief 插入值到数组邻接表中
 * e存储节点编号,ne存储下一个节点的id,w存储节点权重,h存储头节点
 */
void insert(int x, int y, int z)
{
    e[idx] = y;
    ne[idx] = h[x];
    w[idx] = z;
    h[x] = idx++;
}

void spfa()
{
    int hh, tt;
    hh = tt = 0;
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    que[tt++] = 1;
    foot[1] = true;

    while (hh != tt)
    {
        int node_num = que[hh++];
        foot[node_num] = false;
        for (int node = h[node_num]; e[node]; node = ne[node])
        {
            if (dist[e[node]] > dist[node_num] + w[node]) /** 松弛操作 */
            {
                dist[e[node]] = dist[node_num] + w[node];
                if (!foot[e[node]])
                {
                    foot[e[node]] = true;
                    que[tt++] = e[node];
                }
            }
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
#ifdef LOCAL_DEBUG
    ifstream ifs ("./input.txt");
    cin.rdbuf(ifs.rdbuf());
#endif
// === coding here ===

    int n, m;
    cin >> n >> m;
    int x, y, z;
    while (m--)
    {
        cin >> x >> y >> z;
        insert(x, y, z);
    }
    spfa();
    if (dist[n] >= 0x3f3f3f3f)
        cout << "impossible" << endl;
    else
        cout << dist[n] << endl;

// === coding end  ===
    return EXIT_SUCCESS;
}

标签:node,dist,int,tt,BFS,spfa,数组,foot,号点
From: https://www.cnblogs.com/yang5sui/p/17302824.html

相关文章

  • 3、动态数组
    在这里,我们新创建一个数组类,对Java语言中的原始数组进行封装,使得它可以动态的扩容和缩容Java语言中也有类似的实现,叫ArrayList,我们创建的数据类是它的简化版本,下面是代码实现publicclassArray<E>{privateE[]data;privateintsize;publicArray(i......
  • 用 Go 剑指 Offer 42. 连续子数组的最大和
    输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释: 连续子数组 [4,-1,2,1]的和最大,为 6。 提示:1<= arr.length<=10^5-100<=arr[i]<=100......
  • PYTHON 字节数组
    字节数组字节数组是可变类型,采用bytearray内置函数构造。在REPL中,输入help(bytearray)可以获得相关信息。字节数组的来源可以是:可迭代的整数序列,整数范围为0~255;字符串;字节或者另外的字节数组对象;任意实现了缓冲区API的对象。>>>×=bytearray('\×12\×34\×56\×78')>......
  • 【LeeCode】523.连续的子数组和
    【题目描述】给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:子数组大小 至少为2 ,且子数组元素总和为 k 的倍数。如果存在,返回 true ;否则,返回 false 。如果存在一个整数 n ,令整数 x 符合 x=n*k ,则称 x......
  • 数组排序
    1#include<stdio.h>2voidsort1(ints[])3{4inti,j,t;5for(i=0;i<9;i++)6{7for(j=0;j<10;j++)8{9if(s[j]>s[j+1])10{11t=s[j];s[j]=s[j+1];s[j+1]=t;1......
  • 线性表之静态链表实现(数组cur实现)
    main.cpp#include"StaticList.h"intmain(){StaticListSL;InitSList(SL);for(inti=0;i<5;++i){Insert(SL,'A'+i);}ShowSList(SL);DeleteSList(SL);ShowSList(SL);return0;}Stati......
  • gis经纬度坐标转换多格式兼容:支持字符串/数组/GeoJSON
    格式let coordinatesStrReg = /((-*[1][0-9]{0,2}|0)(\.[0-9]{1,6})*),\s{0,2}((-*[1-9][0-9]{0,1}|0)(\.[0-9]{1,6})*)/gstr.replace(coordinatesStrReg, (str, $1, $2, $3, $4, $5) => {  // lat=$1 lng lat=$4  console.log($1, $4)})代码,https://w......
  • C-指针数组与数组指针
    指针数组用于存放指针的数组inta=1,b=2,c=3;int*arr[3]={&a,&b,&c};//arr[0]==&a//*arr[0]==aint**p=arr;//*p==arr[0]==&a//p[0]==arr[0]==&a//*(p+1)==arr[1]==&b//**p==*arr[0]==a//*p[0]==*ar......
  • NOI / 1.8编程基础之多维数组 04:错误探测
    描述给定n*n由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。你的任务就是检测矩阵是否符合条件,或者在仅改变一个矩阵元素的情况下能否符合条件。"改变矩阵元素"的操作定义为0变成1或者1变成0。输入输入n+1行,第1行为矩阵的大小n(0<n<100),以......
  • 字符数组指针巩固学习
    1、字符数组的数组名存的就是字符数组的起始地址,类型是字符指针2、str系列字符串函数主要包括strlen,strcpy,strcmp,strcatstrlen:用于统计字符串长度strcpy:用于将某个字符串复制到字符数组中strcmp:用于比较两个字符串的大小,比较对应字符的ASCII码值strcat:用于将两个字符......