bfs模板
queue<int> q;
st[1] = true; // 表示1号点已经被遍历过
q.push(1);
while (q.size())
{
int t = q.front();
q.pop();
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if (!st[j])
{
st[j] = true; // 表示点j已经被遍历过
q.push(j);
}
}
}
题目
给定一个n个点m条边的有向图,图中可能存在重边和自环。
所有边的长度都是1,点的编号为1~n。
请你求出1号点到n号点的最短距离,如果从1号点无法走到n号点,输出-1。
输入
第一行包含两个整数n和m。
接下来m行,每行包含两个整数a和b,表示存在一条从a走到b的长度为1的边。
4 5
1 2
2 3
3 4
1 3
1 4
输出
输出一个整数,表示1号点到n号点的最短距离。
1
代码
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+10;
int n,m;
int h[N],e[N],ne[N],idx;//数组模拟邻接表
int d[N],q[N];//d[i]表示结点1到第i个点距离
void add(int a,int b){//构造邻接表
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int bfs(){
int hh=0,tt=0;//数组模拟队列
q[0]=1;//从1开始bfs
memset(d,-1,sizeof d);
d[1]=0;//结点1到结点1的距离为0
while(hh<=tt){//队列不空时
int t=q[hh++];//取队头并出队
for(int i=h[t];i!=-1;i=ne[i]){//遍历t的所有邻接点
int j=e[i];// 当此结点没有遍历过 d[j]=上一个点的距离+1
if(d[j]==-1){
d[j]=d[t]+1;
q[++tt]=j;//此节点入队
}
}
}
return d[n];
}
int main(){
cin>>n>>m;
memset(h,-1,sizeof h);
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
add(a,b);
}
cout<<bfs();
return 0;
}