图论(BFS)构造邻接表(运用队列实现搜索)

码蹄集OJ-夏日漫步

复制代码
#include<bits/stdc++.h> 
using namespace std;
int n;
int  a[200010],dis[200010],qaq[1000010];
vector<int>son[200010];
int que[200010];
int main( )
{
    memset(qaq,-1,sizeof(qaq));
    memset(dis,-1,sizeof(dis));
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=n;i>0;i--)
    {
        if(qaq[a[i]]!=-1)
        {
            son[i].push_back(qaq[a[i]]);
        }
        qaq[a[i]]=i;
    }
    for(int i=1;i<n;i++)
    {
        son[i].push_back(i+1);
        son[i+1].push_back(i);   
    }
    int tail=2;
    que[1]=1;
    dis[1]=0;
    for(int i=1;i<=n;i++)
    {
        int cur=que[i];
        for(auto v:son[cur])
        {
            if(dis[v]==-1)
            {
                dis[v]=dis[cur]+1;
                que[tail]=v;
                tail++;
            }
        }
    }
    cout<<dis[n]<<endl;
    return 0;
}

题目表示从头开始每一个节点可以依次相连,构成一个无向图,而且跟据每一个节点的权值可以完善这个图,将权值相同的节点相连,这样题目就抽象成了图论。

由于节点少边多,所以想到运用邻接表进行BFS搜索。

构造邻接表:

复制代码
    for(int i=n;i>0;i--)
    {
        if(qaq[a[i]]!=-1)
        {
            son[i].push_back(qaq[a[i]]);
        }
        qaq[a[i]]=i;
    }
    for(int i=1;i<n;i++)
    {
        son[i].push_back(i+1);
        son[i+1].push_back(i);   
    }

qaq数组存储权值的节点值,初始化时通过memset函数将数组初始化成-1,从后向前遍历数组,如果qaq被赋值,说明在这个节点后有节点的权值与这个节点相同,将这个节点的孩子节点赋值为上一个节点值。(这种遍历方式实现了题目中人只能向后走,而且只能走到与到此节点下一个权值相同的节点)。接着将1到n个节点依次相连就行了,邻接表就构造好了。

BFS搜索过程,寻找最优路径。

复制代码
    int tail=2;
    que[1]=1;
    dis[1]=0;  
    for(int i=1;i<=n;i++)
    {
        int cur=que[i];
        for(auto v:son[cur])
        {
            if(dis[v]==-1)
            {
                dis[v]=dis[cur]+1;
                que[tail]=v;
                tail++;
            }
        }
    }

令队列中存入的第一个根节点是1,从头开始遍历队列中每一个节点,队列中依次存入的是根节点的子节点。dis[i]存储的是节点i到节点1的距离,所以最后输出的是dis[n]。开始时,将dis数组初始化成-1,令dis[1]为0。在遍历队列中节点时,由于v是cur的孩子节点,所以dis[v]的值要在dia[cur]的基础下加1。为了寻找最优路径,要处理一种情况,在当前节点的孩子节点也是当前节点的根节点的孩子节点时,不对这个子节点进行路径更改,也不将子节点入队。也就是避免重复入队保证第一次到达某个节点时的路径就是最短路径

BFS 的核心特性就是:

第一次访问到某个节点时的路径长度,就是最短路径长度。

相关推荐
明洞日记几秒前
【VTK手册017】 深入详解 vtkImageMathematics:医学图像的基本算术运算
c++·图像处理·算法·vtk·图形渲染
杰瑞不懂代码2 分钟前
【公式推导】AMP算法比BP算法强在哪(一)
python·算法·机器学习·概率论
晚风(●•σ )6 分钟前
C++语言程序设计——【算法竞赛常用知识点】
开发语言·c++·算法
浅川.2513 分钟前
xtuoj 哈希
算法·哈希算法·散列表
AndrewHZ16 分钟前
【复杂网络分析】复杂网络分析技术在图像处理中的经典算法与应用实践
图像处理·人工智能·算法·计算机视觉·图像分割·复杂网络·图论算法
free-elcmacom17 分钟前
机器学习入门<4>RBFN算法详解
开发语言·人工智能·python·算法·机器学习
java修仙传24 分钟前
力扣hot100:最长连续序列
算法·leetcode·职场和发展
zore_c25 分钟前
【C语言】文件操作详解3(文件的随机读写和其他补充)
c语言·开发语言·数据结构·笔记·算法
Pluchon29 分钟前
硅基计划4.0 算法 记忆化搜索
java·数据结构·算法·leetcode·决策树·深度优先
CoderYanger30 分钟前
动态规划算法-简单多状态dp问题:18.买卖股票的最佳时机Ⅳ
开发语言·算法·leetcode·动态规划·1024程序员节