Luogu P3645 [APIO2015]雅加达的摩天楼

Posted tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu P3645 [APIO2015]雅加达的摩天楼相关的知识,希望对你有一定的参考价值。

题目
直接BFS求01最短路。
因为状态是(O(nsqrt n))级别的所以没有问题。
注意判断某个hl是否经过某个点要用bitset。

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=30007;
vector<int>dog[N];
bitset<N>vis[N];
queue<tuple<int,int,int>>q;
int used[N],n,m,s,t;
int read(){int x;scanf("%d",&x);return x;}
void move(int p,int id,int step)
{
    if(!used[p])
    {
        used[p]=1;
        for(int x:dog[p]) if (!vis[p][x]) vis[p][x]=1,q.emplace(p,x,step);
    }
    if(~id&&!vis[p][id]) vis[p][id]=1,q.emplace(p,id,step);
}
int main()
{
    n=read(),m=read();int i,b,p,step;
    for(i=0;i^m;++i)
    {
    b=read(),p=read();
    if(!i) s=b;
    if(i==1) t=b;
    dog[b].pb(p);
    }
    if(s==t) return !printf("0");
    move(s,-1,0);
    while(!q.empty())
    {
        tie(b,p,step)=q.front(),q.pop();
        if(b==t) return !printf("%d",step);
        if(b-p>=0) move(b-p,p,step+1);
        if(b+p<n) move(b+p,p,step+1);
    }
    return !printf("-1");
}

以上是关于Luogu P3645 [APIO2015]雅加达的摩天楼的主要内容,如果未能解决你的问题,请参考以下文章

P3645 [APIO2015]雅加达的摩天楼

luogu3645 [Apio2015]雅加达的摩天大楼 (分块+dijkstra)

[APIO 2015] 雅加达的摩天楼

BZOJ 4070: [Apio2015]雅加达的摩天楼

BZOJ4070: [Apio2015]雅加达的摩天楼

bzoj 4070: [Apio2015]雅加达的摩天楼spfa

(c)2006-2024 SYSTEM All Rights Reserved IT常识