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