hdu 1116 poj 1386 欧拉回路并查集



#include

#include
#include
#include
#include
using namespace std;
const int maxn =30;
int pre[maxn],in[maxn],out[maxn];
int n;
    int num, len; //单词个数,每个单词长度
    int start, End; //转化为边
    char s[1010];
    int innum, outnum; //记录入度出度不相等顶点个数
    int root; //根结点个数
    bool flag; //判断连通性
    bool flag1; //判断入度和出度是否是1或者0
bool vis[maxn];
int ffind(int x)
{
    return x == pre[x]?x:pre[x];
}
void Union(int x,int y)
{
        int roox, rooy;
        roox = ffind(x);
        rooy = ffind(y);
        if(roox != rooy)
            pre[roox] = rooy;
}

int main()
{
    int t;
    scanf("%d",&t);
    for(int i = 1; i <= t;i++)
    {
        memset(vis,0,sizeof(vis));
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        for(int i = 0 ; i              pre[i] = i;
        innum = outnum = root = 0;
        flag1 =flag = 1;
        scanf("%d",&n);
        for(int i = 1; i<= n;i++)
        {
            scanf("%s",s);
            len = strlen(s);
            start = s[0]-'a'+1;
            End = s[len-1]-'a'+1;
            vis[start] = 1;
            vis[End] = 1;
            out[start]++;
            in[End]++;
            Union(start,End);
        }
        for(int i = 0 ;i         {
            if(vis[i])
            {
                if(pre[i] == i)
                    root++;
                if(in[i]!=out[i])
                {
                    if(in[i] - out[i] == 1)
                        outnum++;
                    else
                    if(out[i]-in[i] == 1)
                        innum++;
                    else flag1 = 0;
                }
            }
            if(root>1){
                flag = 0;
                break;}
        }
        if((flag&&flag1&&outnum == 0&&innum==0)||(flag&&flag1&&outnum==1&&innum ==1))
            printf("Ordering is possible.\n");
        else
            printf("The door cannot be opened.\n");
    }
    return 0;
}

你可能感兴趣的:(图论专项)