AcWing 847. 图中点的层次

队列

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

 

posted @ 2019-11-10 21:36  晴屿  阅读(154)  评论(0编辑  收藏  举报