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;
}