DFS做法,没有什么可讲的,注意回溯一下。
//DFS做法
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define PI acos(-1.0)
#define max(a,b) (a)>(b)? (a):(b)
#define min(a,b) (a)>(b)? (b):(a)
#define INT_MIN -0x7FFFFFFF
#define INT_MAX 0x7FFFFFFF
char str[100];
char data[300][2];
int vis[300];
int n,flag;
void dfs(int x,char ch)
{
int i,j,k;
char c;
if(ch=='m')
{
flag=1; return ;
}
for(i=1;i<=n;i++)
{
if(vis[i]) continue;
if(data[i][0]==ch)
{
vis[i]=1;
dfs(i,data[i][1]);
vis[i]=0;//注意回溯
}
}
}
int main()
{
// freopen("in.txt","r",stdin);
int i,j,k;
while(scanf("%s",str)!=EOF)
{
n=0;
while(str[0]!='0')
{
data[++n][0]=str[0];
int len=strlen(str);
data[n][1]=str[len-1];
scanf("%s",str);
}
flag=0;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
{
if(data[i][0]=='b')
{
dfs(i,data[i][1]);
}
}
if(flag) printf("Yes.\n");
else printf("No.\n");
}
return 0;
}
图论 求最短路中,求所有定点之间的最短路---Floyd算法
先建图,存储为邻接矩阵,Floyd 算法即3重循环,最外一层循环是,把某个点加入后是否可以构成新的连通,所有点全部加入,即可以得到最终的可以最大到达的图
代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define max(a,b) (a)>(b)? (a):(b)
#define min(a,b) (a)>(b)? (b):(a)
#define INT_MIN -0x7FFFFFFF
#define INT_MAX 0x7FFFFFF
char map[30][30];
int main()
{
//freopen("in.txt","r",stdin);
int i,j,k;
char str[100];
while(scanf("%s",str)!=EOF)
{
memset(map,0,sizeof(map));
while(strcmp(str,"0")!=0)
{
int len=strlen(str);
map[str[0]-'a'][str[len-1]-'a']=1;
scanf("%s",str);
}
for(k=0;k<='z'-'a';k++)
{
for(i=0;i<='z'-'a';i++)
{
for(j=0;j<='z'-'a';j++)
{
if(map[i][j]) continue;
if(map[i][k] && map[k][j]) map[i][j]=1;
}
}
}
if(map['b'-'a']['m'-'a']) printf("Yes.\n");
else printf("No.\n");
}
return 0;
}