Bessie Come Home回家
题目大意:
有n条路连接着一些牧场,每个牧场由‘a-z’(没羊)和‘A-Y’(有一头羊),问哪个有羊的牧场离‘Z’最近
INPUT FORMAT
第 1 行: 整数 P(1<= P<=10000),表示连接牧场(谷仓)的道路的数目。
第 2 …P+1行: 用空格分开的两个字母和一个整数:
被道路连接牧场的标记和道路的长度(1<=长度<=1000)。
SAMPLE INPUT
5
A d 6
B d 3
C e 9
d Z 8
e Z 3
OUTPUT FORMAT
单独的一行包含二个项目:
最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。
SAMPLE OUTPUT
B 11
解题思路:
首先字符先进行一些操作变成数字,然后用SPFA,求出最短路,然后从有羊的牧场中选离‘Z’最近的牧场,然后再转换成字符,再输出,还要输出他的距离
# include <cstdio>
# include <iostream>
# include <cstring>
# include <queue>
using namespace std;
int h, now, w, g, ans, n, x, y, c[ 60 ] , b[ 60 ] , head[ 60 ] , p[ 60 ] ;
char st, st1;
struct rec
{ int to, l, next;
} f[ 20005 ] ;
int main ( )
{ scanf ( "%d" , & n) ; for ( int i= 1 ; i<= n; i++ ) { cin>> st>> st1; if ( st>= 'a' && st<= 'z' ) x= st- 'a' + 1 ; else { x= st- 'A' + 27 ; c[ x] = 1 ; } if ( st1>= 'a' && st1<= 'z' ) y= st1- 'a' + 1 ; else { y= st1- 'A' + 27 ; c[ y] = 1 ; } scanf ( "%d" , & g) ; f[ ++ w] . to= y; f[ w] . l= g; f[ w] . next= head[ x] ; head[ x] = w; f[ ++ w] . to= x; f[ w] . l= g; f[ w] . next= head[ y] ; head[ y] = w; } memset ( b, 127 / 3 , sizeof ( b) ) ; queue< int > d; d. push ( 52 ) ; p[ 52 ] = 1 ; b[ 52 ] = 0 ; while ( ! d. empty ( ) ) { now= d. front ( ) ; d. pop ( ) ; for ( int i= head[ now] ; i; i= f[ i] . next) if ( b[ now] + f[ i] . l< b[ f[ i] . to] ) { b[ f[ i] . to] = b[ now] + f[ i] . l; if ( ! p[ f[ i] . to] ) { d. push ( f[ i] . to) ; p[ f[ i] . to] = 1 ; } } p[ now] = 0 ; } ans= 2147483647 ; for ( int i= 1 ; i< 52 ; ++ i) if ( c[ i] && b[ i] < ans) { ans= b[ i] ; h= i; } if ( h<= 26 ) putchar ( 'a' + h- 1 ) ; else putchar ( 'A' + h- 27 ) ; printf ( " %d" , ans) ;
}