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

  

 

posted @ 2017-11-12 15:02  zhang--yd  阅读(246)  评论(0编辑  收藏  举报