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 }
posted @ 2012-09-09 20:40  Wheat″  阅读(193)  评论(0)    收藏  举报