您的位置:首页 > 其它

uva 10129 - Play on Words

2013-05-02 17:39 411 查看
花了很长时间才勉强明白的。。。。。。

#include<cstdio>
#include<cstring>
using namespace std;
int map[30][30],vis[30],in[30],out[30];
int cnt,q[100000];
void dfs(int u)
{
    vis[u]=1;
    int front=0,rear=0;
    q[rear++]=u;
    while(front<rear)
    {
        u=q[front++];
        for(int i=0; i<26; i++)
        {
            if(!vis[i]&&(map[u][i]||map[i][u]))
            {
                vis[i]=1;
                q[rear++]=i;
                cnt++;
            }
        }
    }
}
int main()
{

    int cas,n,cor;
    char str[1010];
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d\n",&n);
        memset(map,0,sizeof(map));
        memset(vis,0,sizeof(vis));
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        cor=0;
        for(int i=0; i<n; i++)
        {
            scanf("%s\n",str);
            int a,b;
            a=str[0]-'a';
            b=str[strlen(str)-1]-'a';
            map[a][b]++;
            in[a]++;
            out[b]++;
            if(!vis[a])
            {
                cor++;
                vis[a]=1;
            }
            if(!vis[b])
            {
                cor++;
                vis[b]=1;
            }
        }
        memset(vis,0,sizeof(vis));
        cnt=1;
        dfs(0);
        if(cnt!=cor)
        {
            printf("The door cannot be opened.\n");
            continue;
        }
        int mark=0,inn=-1,outt=-1;
        for(int i=0; i<26; i++)
        {
            if(in[i]!=out[i])
            {
                mark++;
                if(in[i]-out[i]==1)
                    inn=i;
                else outt=i;
            }
            if(mark>2)
            {
                printf("The door cannot be opened.\n");
                break;
            }
        }
        if((mark==2&&inn!=-1&&outt!=-1)||mark<2)
            printf("Ordering is possible.\n");
        else if(mark<=2) printf("The door cannot be opened.\n");
    }
    return 0;
}


欧拉回路的题目:

首先在读入的时候只需要提取出单词的首尾字母就可以了,并且用 in[] 和out[]数组记录每一个字母的入度和出度。dfs函数判断是否是连通的,这个函数这段时间经常用。。接着是判断入度和出度:判断一共有几个点是入度和出度不等的,如果超过两个点,就一定没有欧拉道路存在;如果是2个点,要判定这个两个点是不是一个是起点,一个是汇点,起点是出度比入度大一,汇点是入度比出度大1,如果不满足条件也是没有解的;小于2个点的,就是有欧拉道路存在!参考博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: