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");
}
原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/11774267.html