树与图的广度优先遍历:acwing 847. 图中点的层次

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;
int n,m;
int h[N],e[N],ne[N],idx;
int d[N];

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

int bfs()
{
    memset(d,-1,sizeof d);
    queue<int> q;
    d[1]=0;
    q.push(1);
    
    while(q.size())
    {
        int t=q.front();
        q.pop();
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(d[j]==-1)
            {
                d[j]=d[t]+1;
                q.push(j);
            }
        }
    }
    return d[n];
}

int main()
{
    memset(h,-1,sizeof h);
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b);
    }
    printf("%d\n",bfs());
    return 0;
}

最短路使用bfs,建立链表使用这个代码模板

cpp 复制代码
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

bfs算法的模板

cpp 复制代码
int bfs()
{
    memset(d,-1,sizeof d);
    queue<int> q;
    d[1]=0;
    q.push(1);
    
    while(q.size())
    {
        int t=q.front();
        q.pop();
        for(int i=h[t];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(d[j]==-1)
            {
                d[j]=d[t]+1;
                q.push(j);
            }
        }
    }
    return d[n];
}

注意需要把链表头初始化,不然会超时

相关推荐
HalvmånEver7 分钟前
红黑树实现与原理剖析(上篇):核心规则与插入平衡逻辑
数据结构·c++·学习·算法·红黑树
哆啦刘小洋21 分钟前
T:堆的基本介绍
算法
AresXue1 小时前
你是否也在寻找二进制和字符串的高效转换算法?
算法
Swift社区1 小时前
从 0 到 1 构建一个完整的 AGUI 前端项目的流程在 ESP32 上运行
前端·算法·职场和发展
RTC老炮1 小时前
webrtc弱网-BitrateEstimator类源码分析与算法原理
网络·人工智能·算法·机器学习·webrtc
程序员烧烤1 小时前
【leetcode刷题007】leetcode116、117
算法·leetcode
ghie90902 小时前
基于libsvm的支持向量机在MATLAB中的实现
算法·支持向量机·matlab
Rubisco..4 小时前
牛客周赛 Round 111
数据结构·c++·算法
兮山与4 小时前
算法8.0
算法
高山上有一只小老虎4 小时前
杨辉三角的变形
java·算法