队列
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <queue> using namespace std; const int N = 100010; int n, m; int h[N], e[N], ne[N], idx; int 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); queue<int> q; d[1] = 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];//j扩展 if (d[j] == -1) {//如果没有被遍历过 d[j] = d[t] + 1;//扩展 q.push(j);//插入 } } } return d[n]; } int main() { scanf("%d%d", &n, &m); memset(h, -1, sizeof h); for (int i = 0; i < m; i ++ ) { int a, b; scanf("%d%d", &a, &b); add(a, b); } cout << bfs() << endl; return 0; }
模拟队列
#include<bits/stdc++.h> using namespace std ; const int N=100010; int n,m; int h[N],e[N],ne[N],idx; int d[N],q[N]; 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; memset(d,-1,sizeof d); d[1]=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); for(int i=0;i<m;i++) { int a,b; cin>>a>>b; add(a,b); } cout<<bfs()<<endl; }