题面
题意:
一个有向图,从 S S S出发,每次只能走三步(即连续三条边),现在问你能否经过若干步到达 T T T,如果可以输出最少的步数,否则输出 − 1 -1 −1。
思路:
d i s i , j dis_{i,j} disi,j代表 S 到 i S到i S到i的距离 d i s dis dis m o d mod mod 3 3 3为 j j j的最短路,我们要计算的即为 d i s T , 0 dis_{T,0} disT,0, B F S BFS BFS即可,注意状态的传递。
code:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+100;
const long long INF = 999999999999;
long long dis[N][3];
vector<int> G[N];
bool vis[N][3];
struct node{
int id;
int dis;
};
int n,m,S,T;
queue<node> q;
void dijkstra(int S){
for(int i=1;i<=n+100;i++){
for(int j=0;j<3;j++) dis[i][j]=INF,vis[i][j]=0;
}
dis[S][0]=0;
q.push({S,0});
while(!q.empty()){
node rt=q.front();q.pop();
int u=rt.id;
int L=rt.dis;
if(vis[u][L]) continue;
vis[u][L]=1;
for(auto v:G[u]){
int nowL=(L+1)%3;
if(dis[v][nowL]>dis[u][L]+1){
dis[v][nowL]=dis[u][L]+1;
q.push({v,nowL});
}
}
}
}
int main(){
cin>>n>>m;
int u,v;
for(int i=1;i<=m;i++){
cin>>u>>v;
G[u].push_back(v);
}
cin>>S>>T;
dijkstra(S);
//cout<<dis[T][0]<<endl;
if(dis[T][0]==INF) puts("-1");
else cout<<dis[T][0]/3<<endl;
return 0;
}