您的位置:首页 > 其它

hdu 1116 poj 1386 欧拉回路并查集

2017-04-26 18:29 381 查看
#include<iostream>

#include<stdio.h>

#include<string>

#include<string.h>

#include<algorithm>

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息