前言
当图中边权都一样的时候,可以用BFS
搜索来求最短路问题。
一、题目陈述
给定一个n个点m条边的有向图,图中可能存在重边和自环。
所有边的长度都是1,点的编号为1~n。
请你求出1号点到n号点的最短距离,如果从1号点无法走到n号点,输出-1。
输入格式
第一行包含两个整数n和m。
接下来m行,每行包含两个整数a和b,表示存在一条从a走到b的长度为1的边。
输出格式
输出一个整数,表示1号点到n号点的最短距离。
数据范围
1≤n,m≤1e5
输入样例
4 5
1 2
2 3
3 4
1 3
1 4
输出样例
1
二、解决思路
因为所有边的权重都是一样的,所以可以用BFS
来进行最短路的搜索。
三、代码实现
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N = 1e5+10,M=N*2;
// n个点 m条边
int n,m;
// 领接表存图 idx和节点编号从0还是1开始没有任何关系,idx没有实用作用
int h[N],e[M],ne[M],idx;
// 头插法 将节点b插入到节点a伸出的链表中
void add(int a,int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
// 各个点到节点1的距离数组
int d[N];
int bfs() {
memset(d,-1,sizeof(d));
queue<int> q;
q.push(1);
d[1]=0;
while(!q.empty()) {
int t = q.front();
q.pop();
for(int i=h[t];i!=-1;i=ne[i]) {
int j=e[i];
if(d[j]==-1) {
d[j]=d[t]+1;
q.push(j);
}
}
}
return d[n];
}
int main() {
memset(h,-1,sizeof(h));
cin>>n>>m;
for(int i=0;i<m;i++) {
int a,b;
cin>>a>>b;
add(a,b);
}
cout<<bfs()<<endl;
return 0;
}
总结
图的BFS
搜索其实就是将BFS
搜索框架整合到邻接表的代码框架中。当图中所有边的权重都一样的时候,就可以用BFS
来进行最短路问题的求解。