HDU 1116 Play on Words(有向图欧拉路)

来源:互联网 发布:python 字典嵌套 编辑:程序博客网 时间:2024/05/16 07:31

题目链接:Click here~~

题意:

给 n 个词语,问是否能够词语接龙。

解题思路:

先用并查集找连通分量,然后根据结论来吧。

#include <map>#include <vector>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;namespace UFset{    const int N = 27;    int pre[N];    void init(){        memset(pre,-1,sizeof(pre));    }    int root(int x){        return pre[x] == -1 ? x : pre[x] = root(pre[x]);    }    bool gather(int a,int b){        int r1 = root(a);        int r2 = root(b);        if(r1 == r2)            return false;        else            pre[r1] = r2;            return true;    }}using namespace UFset;int ind[N],outd[N];bool EulerTour(int n)       //direct{    int rt = -1;    for(int i=1;i<=n;i++)        if(ind[i] || outd[i])        {            if(rt == -1)                rt = root(i);            else if(rt != root(i))                return false;        }    vector<int> tmp;    for(int i=1;i<=n;i++)        if(ind[i] != outd[i])            tmp.push_back(outd[i]-ind[i]);    return (int)tmp.size() == 0 || (int)tmp.size() == 2 && tmp[0] * tmp[1] == -1;}char word[1005];int main(){    int n = 26,m,T;    scanf("%d",&T);    while(T--)    {        init();        scanf("%d",&m);        memset(ind,0,sizeof(ind));        memset(outd,0,sizeof(outd));        for(int i=0;i<m;i++)        {            scanf("%s",word);            int u = word[0] - 'a' + 1;            int v = word[strlen(word)-1] - 'a' + 1;            gather(u,v);            ++outd[u] , ++ind[v];        }        puts(EulerTour(n)?"Ordering is possible.":"The door cannot be opened.");    }    return 0;}


原创粉丝点击