POJ - 1847
Description Tram network in Zagreb consists of a number of intersections and rails connecting some of them. In every intersection there is a switch pointing to the one of the rails going out of the intersection. When the tram enters the intersection it can leave only in When a driver has do drive from intersection A to the intersection B he/she tries to choose the route that will minimize the number of times he/she will have to change the switches manually. Write a program that will calculate the minimal number of switch changes necessary to travel from intersection A to intersection B. Input The first line of the input contains integers N, A and B, separated by a single blank character, 2 <= N <= 100, 1 <= A, B <= N, N is the number of intersections in the network, and intersections are numbered from 1 to N. Each of the following N lines contain a sequence of integers separated by a single blank character. First number in the i-th line, Ki (0 <= Ki <= N-1), represents the number of rails going out of the i-th intersection. Next Ki numbers represents the intersections Output The first and only line of the output should contain the target minimal number. If there is no route from A to B the line should contain the integer "-1". Sample Input 3 2 1 2 2 3 2 3 1 2 1 2 Sample Output 0 /* *Author: 2486 *Memory: 716 KB Time: 16 MS *Language: G++ Result: Accepted */ //理解题目意思,看懂题目即可 //其中注意细节,开关最开始的方向是由第一个数的值所确定的,所以对于第一个数的 //状态是不需要进行开关操作的 #include <iostream> #include <cstring> #include <string> #include <cstdio> #include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int N = 100 + 5; int n,a,b,x,y; int d[N][N]; int warshall_floyd() { for(int i = 0 ; i <= n; i ++) { d[i][i] = 0; } for(int k = 1; k <= n; k ++) { for(int i = 1 ; i <= n; i ++) { for(int j = 1; j <= n ; j ++) { d[i][j] = min(d[i][j], d[i][k] + d[k][j]); } } } } int main() { while(~scanf("%d%d%d",&n,&a,&b)) { memset(d,0x3f,sizeof(d)); for(int i = 1; i <= n; i ++) { scanf("%d",&x); for(int j = 0; j < x; j ++) { scanf("%d",&y); if(j) d[i][y] = 1; else d[i][y] = 0; } } warshall_floyd(); if(d[a][b] != INF)printf("%d\n",d[a][b]); else printf("-1\n"); } return 0; } |
版权声明:本文为博主原创文章,未经博主允许不得转载。