题目大意:给定一组单词(均为小写英文字母),每个单词表示能将其首字母变成尾字母,例如"go"表示能将'g'变成'o',问同过给定的单词能否将'b'变成'm'。
分析:先建立有向图,然后对图进行DFS。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <string.h> 3 #define N 60000000 4 char s[N],vis[26]; 5 bool g[26][26]; 6 bool read_case() 7 { 8 int n; 9 while(gets(s)) 10 { 11 if(s[0]<'a') return true; 12 n=strlen(s); 13 g[s[0]-'a'][s[n-1]-'a']=true; 14 } 15 return false; 16 } 17 void dfs(int k) 18 { 19 for(int i=0;i<26;i++) 20 { 21 if(g[k][i] && !vis[i]) vis[i]=1,dfs(i); 22 } 23 } 24 int main() 25 { 26 while(read_case()) 27 { 28 memset(vis,0,sizeof(vis)); 29 vis[1]=1; 30 dfs(1); 31 if(vis['m'-'a']) puts("Yes."); 32 else puts("No."); 33 memset(g,0,sizeof(g)); 34 } 35 return 0; 36 }