因为权值全为1,并且求1~n的最短路,可以用bfs。
图中可能存在重边和自环,可以开一个数组,记录1~某点的最短路径,同时可以避免走重边和自环(走到某点就修改其最短路径,若走到的点已经被修改过,就说明在走重边或自环)
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=100010;
int dp[N];
int n,m;
int head[N],e[N],ne[N],idx;
queue<int> que;
void add(int x,int y){
e[idx]=y;
ne[idx]=head[x];
head[x]=idx;
idx++;
}
int bfs(int s){
que.push(s);
dp[s]=0;
while(!que.empty()){
auto t=que.front();
que.pop();
for(int i=head[t];i!=-1;i=ne[i]){
if(dp[e[i]]==-1){
que.push(e[i]);
dp[e[i]]=dp[t]+1;
}
}
}
return dp[n];
}
int main(){
memset(head,-1,sizeof(head));
memset(dp,-1,sizeof(dp));
cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
add(a,b);
}
cout<<bfs(1);
return 0;
}