标签:pac return its turn can ack tuple ref scan
题目
直接BFS求01最短路。
因为状态是\(O(n\sqrt 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");
}
标签:pac return its turn can ack tuple ref scan
原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/11774267.html