题目链接:https://syzoj.com/problem/4
内存限制:128 MiB 时间限制:1000 ms

题目描述

有 n 个 城市,从1到n给他们编号,它们之间由一些单向道路(即一条道路只能从一个方向走向另一个方向,反之不行)相连,现在要求从1走到n。问最少经过几条路。
保证存在从1到n的路径。

输入格式

第一行两个整数n和m,表示有多少个城市和多少条道路。
接下来m行,每行两个整数s、t,即有一条从s到t的路。

输出格式

一行一个整数,即从1到n最少经过几条路。

输入样例

6 6 
1 3 
2 6 
3 6 
3 2 
6 4 
4 5

样例输出

2

数据范围与提示

70%的数据,1<=n,m<=1000
100%的数据,1<=n,m<=100000

解题思路

直接BFS搜索就行了,也可以用最短路来做。

#include <queue>
#include <cstring>
#include <iostream>
#define MAXN 100005
using namespace std;
struct edge {
    int u, v, w;
}e[MAXN];
int n, m, cnt, f[MAXN], dis[MAXN], vis[MAXN];
void Add(int u, int v) {
    e[++cnt] = (edge){f[u], v};
    f[u] = cnt;
}
int BFS(int s) {
    queue <int> Q;
    Q.push(s);
    vis[s] = 1;
    while (!Q.empty()) {
        int t = Q.front();
        Q.pop();
        for (int i = f[t]; i; i = e[i].u) {
            int v = e[i].v;
            if (!vis[v]) {
                dis[v] = dis[t] + 1;
                if (!(v - m))
                    return dis[v];
                vis[v] = 1;
                Q.push(v);
            }
        }
    }
    return -1;
}
int main() {
    int s, t;
    while (cin >> m >> n) {
        cnt = 0;
        memset(f, 0, sizeof(f));
        memset(vis, 0, sizeof(vis));
        memset(dis, 0, sizeof(dis));
        for (int i = 0; i < n; i++) {
            cin >> s >> t;
            Add(s, t);
        }
        cout << BFS(1) << endl;
    }
    return 0;
}