HDU 1181 变形课

来源:互联网 发布:淘宝退款什么时候到账 编辑:程序博客网 时间:2024/05/16 17:32

大意:给出一些单词,然后一个单词的结尾和一个单词的开头如果是相同的字母,他们就可以相互到达,问是否存在b开头到达m结尾的情况。
做法:string+BFS

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <string>using namespace std;string s[30][1000];//第一维代表以什么字母开头。bool use[30][1000];int num[30];//统计以某字母开头的单词的个数。bool BFS(){    queue<string> q;    while(!q.empty()) q.pop();    for(int i = 0 ; i < num[1] ; i++)    {        q.push(s[1][i]);        use[1][i] = true;    }    while(!q.empty())    {        string a = q.front();        //cout<<a<<endl;        q.pop();        int len = a.length();        if(a[len-1]=='m')            return true;        int x = a[len-1] - 'a';        for(int i = 0 ; i < num[x] ; i++)        {            if(!use[x][i])            {                q.push(s[x][i]);                use[x][i] = true;            }        }    }    return false;}int main(){    string a,b;    while(cin>>a)    {        memset(num,0,sizeof(num));        memset(use,false,sizeof(use));        if(a=="0") continue;        int y = a[0]-'a';        int t = num[y];        b = a;        s[y][t] = b;        num[y]++;        while(cin>>a)        {            if(a=="0") break;            y = a[0]-'a';            t = num[y];            b = a;            s[y][t] = b;            num[y]++;        }        bool flag = BFS();        if(flag) printf("Yes.\n");        else printf("No.\n");    }    return 0;}
0 0