【蓝桥杯C++B组】路径

本文详细介绍了SPFA算法的基本原理及其在解决图论中最短路径问题中的应用。通过具体的代码实现展示了如何使用SPFA算法求解从1号点到n号点的最短路径,并解释了关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

using namespace std;

const int N = 2200, M = N * 50;

int n;
int h[N],e[M],w[M],ne[M],idx;//带权单链表

int q[M] , d[M];//队列,d[]存储距离
bool st[M];

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

//绝对值
int fabs(int x)
{
    if(x < 0) return -x;
    else return x;
}

//最小公约数
int ges(int a , int b)
{
    while(a!=b)
    {
        if(a>b) a = a - b;
        else b = b - a;
    }
    return a;
}

int spfa()  // 求1号点到n号点的最短路距离
{
    int hh = 0, tt = 0;
    memset(d, 0x3f, sizeof d);
    d[1] = 0;
    q[tt ++ ] = 1;
    st[1] = true;

    while (hh != tt)
    {
        int t = q[hh ++ ];
        if (hh == N) hh = 0;
        st[t] = false;

        for (int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (d[j] > d[t] + w[i])
            {
                d[j] = d[t] + w[i];
                if (!st[j])     // 如果队列中已存在j,则不需要将j重复插入
                {
                    q[tt ++ ] = j;
                    if (tt == N) tt = 0;
                    st[j] = true;
                }
            }
        }
    }
    return d[n];
}

int main()
{
    n = 2021;
    memset(h , -1 , sizeof h);
    for(int i = 1 ; i <= n ; i++)  
        for(int j = 1; j <= n ; j++)
        {
            if(fabs(i-j) <= 21)
            {
                int p = ges(i ,j);//最小公约数
                add(i , j , i * j / p);
            }
        }
        
    //求1号点到n号点的最短路距离
    cout << spfa();
}

 现在,她一个人漫游在夜晚的黄原街头,细细思索着孙少平这个人和他的道路。她从他的谈吐中,知道这已经是一个对生活有了独特理解的人。

——《平凡的世界》第二十三章

常常将自己化身为少平,却唯独少了那份坚定 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值