欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

1528:【例 2】单词游戏(有向图的欧拉路径与欧拉图)

程序员文章站 2022-06-25 16:16:47
1528:【例 2】单词游戏时间限制: 1000 ms 内存限制: 32768 KB提交数: 196 通过数: 75【题目描述】来自 ICPC CERC 1999/2000,有改动。有 N 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词。你需要给这些盘子安排一个合适的顺序,使得相邻两个盘子中,前一个盘子上单词的末字母等于后一个盘子上单词的首字母。请你编写一个程序,判断是否能达到这一要求。如果能,请给出一个合适的顺序。【输入】多组数据。第一行给出数据组数 T,每组数...

1528:【例 2】单词游戏

时间限制: 1000 ms 内存限制: 32768 KB
提交数: 196 通过数: 75
【题目描述】
来自 ICPC CERC 1999/2000,有改动。

有 N 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词。你需要给这些盘子安排一个合适的顺序,使得相邻两个盘子中,前一个盘子上单词的末字母等于后一个盘子上单词的首字母。请你编写一个程序,判断是否能达到这一要求。如果能,请给出一个合适的顺序。

【输入】
多组数据。第一行给出数据组数 T,每组数据第一行给出盘子数量 N,接下去 N 行给出小写字母字符串,一种字符串可能出现多次。

【输出】
若存在一组合法解输出Orderingispossible.,否则输出Thedoorcannotbeopened.。

【输入样例】
3
2
acm
ibm
3
acm
malform
mouse
2
ok
ok
【输出样例】
The door cannot be opened.
Ordering is possible.
The door cannot be opened.
【提示】
数据范围与提示

1≤N≤105,∣S∣≤1000

#include <bits/stdc++.h>

using namespace std;
const int N=1e5+5;
int T,n,in[N],out[N],fa[30];
string s;

int Find(int x)
{
    if(x!=fa[x])
        fa[x]=Find(fa[x]);
    return fa[x];
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> T;
    while(T--)
    {
        for(int i=1;i<=26;i++)
            fa[i]=i;
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        cin >> n;
        while(n--)
        {
            cin >> s;
            int len=s.size();
            int u=s[0]-'a'+1,v=s[len-1]-'a'+1;
            out[u]++,in[v]++;
            int x=Find(u),y=Find(v);
            if(x!=y)
                fa[x]=y;
        }
        int num=0,f=0;
        for(int i=1;i<=26;i++)
        {
            if((in[i]||out[i])&&fa[i]==i)
                num++;
            if(num>1)
            {
                f=1;
                break;
            }
        }
        int cnt1=0,cnt2=0;
        for(int i=1;i<=26;i++)
        {
            if(abs(in[i]-out[i])>1)
            {
                f=1;
                break;
            }
            else if(in[i]-out[i]==1)
                cnt1++;
            else if(out[i]-in[i]==1)
                cnt2++;
        }
        if(cnt1!=cnt2||cnt1>1||cnt2>1)
            f=1;
        if(f)
            printf("The door cannot be opened.\n");
        else
            printf("Ordering is possible.\n");
    }
    return 0;
}

本文地址:https://blog.csdn.net/qq_43032263/article/details/107876998

相关标签: 欧拉图