给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环。所有边的长度都是 1,点的编号为 1~n
请你求出 1号点到 n号点的最短距离,如果从 1号点无法走到 n号点,输出 -1
输入格式
第一行包含两个整数 n和 m
接下来 m行,每行包含两个整数 a和 b,表示存在一条从 a走到 b的长度为 1的边。
输出格式
输出一个整数,表示 1
号点到 n
号点的最短距离。
数据范围
1≤n,m≤10^5
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m;
int dist[N];//每个点到1号点的最短距离
vector<int> graph[N];
queue<int> q;
void add(int a,int b){
graph[a].push_back(b);//邻接表存储图 vector简单一点。。。
}
int BFS(){
q.push(1);//插入头节点
memset(dist,0x3f,sizeof(dist));//初始化为正无穷
dist[1]=0;//第一个点到它自己的距离为零
while(!q.empty()){
//push,pop逐级逐层查询并赋值dist[i]
int f=q.front();
q.pop();
//取出头节点
int lenf=graph[f].size();
for(int i=0;i<lenf;i++){
int j=graph[f][i];
if(dist[j]>dist[f]+1){ //因为原始定义的是正无穷,所以只要比父节点 +1大,就更新。
dist[j]=dist[f]+1; //每条边的长度为1;
q.push(j); //引出下一层
}
}
}
return dist[n] != 0x3f3f3f3f ? dist[n] : -1;
}
int main(){
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
add(a,b);
}
cout<<BFS();
return 0;
}
//2023.7.28