hihocoder-1624-最短游览路线
hihocoder-1624-最短游览路线
#1624 : 最短游览路线
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
十一期间小Hi被朋友拉去某座名山旅游。这座山上一共有N个景点,编号1~N,通过M条单向缆车相连。
小Hi和朋友的出发点在1号景点。小Hi正在等待某公司的面试电话,所以他希望找一条路线,搭乘最少次数的缆车(至少一次),回到出发点。
你能求出最少搭乘缆车的次数吗?
输入
第一行包含两个整数N和M。
以下M行,每行包含两个整数a和b,代表有一条从a到b的单向缆车。
对于30%的数据,1 ≤ N ≤ 10, 1 ≤ M ≤ 90
对于100%的数据,1 ≤ N ≤ 10000, 1 ≤ M ≤ 100000, 1 ≤ a, b ≤ N, a ≠ b
输出
回到出发点最少搭乘缆车的次数。如果无法通过缆车回到出发点输出-1。
- 样例输入
-
5 7 1 2 5 1 2 4 2 3 3 2 3 4 4 5
- 样例输出
-
4
#include <cstdio> #include <iostream> #include <vector> using namespace std; const int MAXN = 10000 + 10; int queue_step[MAXN], queue[MAXN], vis[MAXN]; vector<int> mp[MAXN]; int bfs(int cur, const int n){ for(int i=1; i<=n; ++i){ vis[i] = 0; } int head = 0, tail = 0; queue[ head ] = cur; queue_step[ head++ ] = 0; while(head > tail){ int site = queue[tail]; int cur_s = queue_step[tail++]; for(int i=0; i<mp[ site ].size(); ++i){ if( mp[site][i] == cur ){ return (cur_s + 1); } if( vis[mp[site][i]] == 0 ){ queue[ head ] = mp[site][i]; queue_step[head++] = cur_s + 1; vis[ mp[site][i] ] = 1; } } } return -1; } int main(){ int n, m, ans, a, b; while(scanf("%d %d", &n, &m) != EOF){ for(int i=1; i<=n; ++i){ mp[i].clear(); } for(int i=1; i<=m; ++i){ scanf("%d %d", &a, &b); mp[a].push_back(b); } ans = bfs(1, n); printf("%d\n", ans ); } return 0; }