hud1181 -- 变形课 转化为有向边folyd
题目意思:
在给定的单词中 ,求一个以b开头的单词 转化到 一个以m结束的单词,中间转化过程要首尾对应,例如样例中的"big-got-them"便是一个转化过程,可以转化输出Yes. ,否则输出No. 。
我的解题方法:
把26个小写字母当成26个顶点。
每个单词都有一个开始的字母和一个结束的字母,构造开始字母到结束字母为有向边路径为1
通过folyd每个顶点到各个顶点的最短路径。
最后判断 'b' 能否到达 'm' 即可
代码:
View Code
1 //Accepted 1181 0MS 212K 1277 B G++ 2 #include <stdio.h> 3 #include <string.h> 4 #define inf 0x7fffffff 5 #define N 30 6 int map[N][N]; 7 8 void init() 9 { 10 for(int i = 0; i < 30 ; ++ i) 11 for(int j = 0; j < 30 ; ++ j) 12 if( i != j ) 13 map[i][j] = inf; 14 else 15 map[i][j] = 0; 16 } 17 void floyd() 18 { 19 for(int k = 0; k < 26 ;++ k) 20 for(int i = 0; i < 26 ; ++ i) 21 { 22 if(k != i) 23 for(int j = 0 ; j < 26 ; ++ j) 24 if( map[i][k] != inf && map[k][j] != inf && ( map[i][k] + map[k][j] ) < map[i][j] ) 25 map[i][j] = map[i][k] + map[k][j]; 26 } 27 } 28 29 void solve() 30 { 31 char ch[100]; 32 while(scanf("%s",ch) != EOF) 33 { 34 init(); 35 map[ch[0] - 'a'][ch[strlen(ch) - 1] - 'a'] = 1; 36 while(scanf("%s",ch)) 37 { 38 if(strcmp(ch,"0") == 0 ) break; 39 map[ch[0] - 'a'][ch[strlen(ch) - 1] - 'a'] = 1; 40 } 41 floyd(); 42 if(map['b' - 'a']['m' - 'a'] < inf) 43 puts("Yes."); 44 else 45 puts("No."); 46 } 47 } 48 49 int main(void) 50 { 51 solve(); 52 return 0; 53 }


浙公网安备 33010602011771号