题目链接: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;
}