解法一:用vector数组来存每个点的相邻子节点,进行遍历
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,m;
//int h[maxn],e[2*maxn],ne[2*maxn],idx;
vector<int> p[maxn];
int d[maxn];
//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.empty())
{
int t=q.front();
q.pop();
for(int i=0; i<p[t].size(); i++)
{
int j=p[t][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));
for(int i=0; i<m; ++i)
{
int a,b;
cin>>a>>b;
// add(a,b);
p[a].push_back(b);
}
cout<<bfs()<<endl;
return 0;
}
解法二:用3个数组来实现vector的二维数组,来存每个子节点的相邻节点。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,m;
int h[maxn],e[2*maxn],ne[2*maxn],idx;
int d[maxn];
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.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()
{
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;
return 0;
}