9360. HIPERCIJEVI
|
|||||||||
|
|||||||||
Description
In a galaxy far, far away, the fastest method of transportation is using hypertubes. Each hypertube directly connects K stations with each other. What is the minimum number of stations that we need to pass through in order to get from station 1 to station N? Input
The first line of input contains three positive integers: N (1 ≤ N ≤ 100 000), the number of stations, K (1 ≤ K ≤ 1 000), the number of stations that any single hypertube directly interconnects, and M (1 ≤ M ≤ 1 000), the number of hypertubes. Each of the following M lines contains the description of a single hypertube: K positive integers, the labels of stations connected to that hypertube. Output
The first and only line of output must contain the required minimum number of stations. If it isn't possible to travel from station 1 to station N, output -1. Sample Input
input 1: 9 3 5 1 2 3 1 4 5 3 6 7 5 6 7 6 8 9 input 2: 15 8 4 11 12 8 14 13 6 10 7 1 5 8 12 13 6 2 4 10 15 4 5 9 8 14 12 11 12 14 3 5 6 1 13 Sample Output
output 1: 4 output 2: 3 #include <iostream> #include <cstring> #include <queue> #include <vector> #include<cstdio> using namespace std; #define maxn 100005 vector <int>p[maxn+1000]; int dis[maxn+1000]; queue <int>q; int n,k,m; int main() { int i,j; while(cin>>n>>k>>m) { for(i=1; i<=n+m; i++) p[i].clear(); for(i=1; i<=m; i++) for(j=1; j<=k; j++) { int a; scanf("%d",&a); p[i+n].push_back(a); p[a].push_back(i+n); } memset(dis,-1,sizeof(dis)); dis[1]=0; while(!q.empty()) q.pop(); q.push(1); int ans=-1; while(!q.empty()) { int tmp=q.front(); q.pop(); for(i=0;i<p[tmp].size();i++) if(dis[p[tmp][i]]==-1) { dis[p[tmp][i]]=dis[tmp]+1; if(p[tmp][i]==n) ans=dis[p[tmp][i]]/2+1; q.push(p[tmp][i]); } if(ans!=-1) break; } cout<<ans<<endl; } } |