HDU 1181 变形记 (DFS / Floyd)

来源:互联网 发布:淘宝mp3 编辑:程序博客网 时间:2024/06/06 19:38
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 0x7FFFFFFFchar 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 0x7FFFFFFchar 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;}



原创粉丝点击