当图中的每条边的权值都为1时,bfs可以求最短路问题
手写队列
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int h[N],ne[N],e[N],idx;
int n,m;
int q[N],d[N]; //队列和结果数组,这里结果数组和判重数组可以合二为一
void add(int a,int b) //经典邻接表的模板
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int bfs()
{
memset(d,-1,sizeof d);
d[1]=0; //一号点到一号点的距离为0
q[0]=1; //将第一个点入队
int hh=0,tt=0; //手写队列
while (hh<=tt)
{
int t = q[hh++];
for (int i=h[t];i!=-1;i=ne[i])
{
int j=e[i];
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); //邻接表的初始化
while (m--)
{
int a,b;
cin>>a>>b;
add(a,b);
}
cout<<bfs()<<endl;
return 0;
}
直接用STL的queue
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 100010;
int h[N],ne[N],e[N],idx;
int n,m;
int d[N];
queue<int>q; //借助STL实现队列
//队列和结果数组,这里结果数组和判重数组可以合二为一
void add(int a,int b) //经典邻接表的模板
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int bfs()
{
memset(d,-1,sizeof d);
d[1]=0; //一号点到一号点的距离为0
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 (d[j]==-1)
{
d[j]=d[t]+1;
q.push(j);
}
}
}
return d[n];
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof h); //邻接表的初始化
while (m--)
{
int a,b;
cin>>a>>b;
add(a,b);
}
cout<<bfs()<<endl;
return 0;
}