HDU 1181 变形课

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1181

此题多种方法。比如说Flyod传递闭包 就能搞定 这里只写DFS和BFS

熟悉下。只有DFS是我写的,其他的都是同学的。

DFS

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #define N 30
 5 int m[N][N],flag,visit[N];
 6 void dfs(int n)
 7 {
 8     int i;
 9     if(n=='m'-'a')
10     {
11         flag=1;return;
12     }
13     for(i=0;i<26;i++)
14     {
15        if(m[n][i]==1&&!visit[i])
16        {
17            visit[i]=1;
18            dfs(i);
19        }
20     }
21 }
22 int main()
23 {
24     char s[100];int len;
25     memset(m,0,sizeof(m));
26     memset(visit,0,sizeof(visit));
27     while(scanf("%s",s)&&s[0]!='0')
28     {
29         len=strlen(s);
30         m[s[0]-'a'][s[len-1]-'a']=1;
31         while(scanf("%s",s)&&s[0]!='0')
32         {
33             flag=0;
34             len=strlen(s);
35             m[s[0]-'a'][s[len-1]-'a']=1;
36         }
37         dfs(1);
38         flag== 1 ? printf( "Yes.\n" ) : printf( "No.\n" );
39     }
40     return 0;
41 }

BFS

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 int q[100000];
 4 int map[30][30];
 5 int pro[100000];
 6 int f,r;
 7 
 8 int main()
 9 {
10     int n,i,j,len,leap;
11     char s[200];
12     while(scanf("%s",s) != EOF)
13     {
14         leap = 0;
15         memset(map,0,sizeof(map));
16         memset(pro,0,sizeof(pro));
17         memset(q,0,sizeof(q));
18         len = strlen(s);
19         map[s[0]-'a'][s[len-1]-'a'] = 1;
20 
21         while(scanf("%s",s) != EOF)
22         {
23             len = strlen(s);
24             if(s[0] == '0')
25             break;
26             map[s[0]-'a'][s[len-1]-'a'] = 1;
27         }
28         f = 0,r = 0;
29         q[r++] = 'b'-'a';
30         while(f < r)
31         {
32             int v;
33             v = q[f++];
34             for(i = 0;i < 26;i++)
35             {
36                 if(map[v][i] && !pro[i])
37                 {
38                     if(i == 'm'-'a')
39                     {
40                         leap = 1;
41                         break;
42                     }
43                     q[r++] = i;
44                     pro[i] = 1;
45                 }
46             }
47             if(leap)
48             break;
49         }
50         if(leap)
51         puts("Yes.");
52         else
53         puts("No.");
54     }
55     return 0;
56 }

用STL queue实现队列的 BFS

View Code
 1 #include <queue> 
 2 #include <cstdio> 
 3 #include <cstring> 
 4 #include <iostream> 
 5 using namespace std; 
 6 
 7 const int N=1001; 
 8 int map[N][N]; 
 9 int vis[N]; 
10 queue<int>q; 
11 
12 int bfs() 
13 { 
14     while(!q.empty()) 
15     { 
16         int a; 
17         a=q.front(); 
18         q.pop(); 
19         for(int i=0;i<26;i++) 
20         { 
21             if(map[a][i]&&!vis[i]) 
22             { 
23                 if(i=='m'-'a') 
24                 { 
25                     return 1; 
26                 } 
27                 q.push(i); 
28                 vis[i]=1; 
29             } 
30         } 
31     } 
32     return 0; 
33 } 
34 
35 int main() 
36 { 
37     int len; 
38     char s[N]; 
39     while(~scanf("%s",s)) 
40     { 
41         while(!q.empty()) 
42             q.pop(); 
43         memset(map,0,sizeof(map)); 
44         memset(vis,0,sizeof(vis)); 
45         len=strlen(s); 
46         map[s[0]-'a'][s[len-1]-'a']=1; 
47         while(~scanf("%s",s)) 
48         { 
49             len=strlen(s); 
50             if(s[0]=='0') 
51                 break; 
52             map[s[0]-'a'][s[len-1]-'a']=1; 
53         } 
54         q.push('b'-'a'); 
55         if(bfs()) 
56             puts("Yes."); 
57         else 
58             puts("No."); 
59     } 
60     return 0; 
61 } 
原文地址:https://www.cnblogs.com/timeship/p/2619421.html