HDU 1181 变形记 (DFS / Floyd)

本文介绍了两种重要的图论算法:深度优先搜索(DFS)及其应用案例,以及弗洛伊德(Floyd)算法用于求解图中所有顶点间的最短路径问题。通过具体的代码实现,展示了如何使用这些算法解决特定问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值