您的位置:首页 > 其它

nyoj 99 单词拼接 【欧拉回路】

2015-12-02 20:23 417 查看

单词拼接

时间限制:3000 ms | 内存限制:65535 KB
难度:5

描述
给你一些单词,请你判断能否把它们首尾串起来串成一串。

前一个单词的结尾应该与下一个单词的道字母相同。



aloha

dog

arachnid

gopher

tiger

rat

可以拼接成:aloha.arachnid.dog.gopher.rat.tiger

输入第一行是一个整数N(0<N<20),表示测试数据的组数

每组测试数据的第一行是一个整数M,表示该组测试数据中有M(2<M<1000)个互不相同的单词,随后的M行,每行是一个长度不超过30的单词,单词全部由小写字母组成。输出如果存在拼接方案,请输出所有拼接方案中字典序最小的方案。(两个单词之间输出一个英文句号".")

如果不存在拼接方案,则输出

***样例输入
2
6
aloha
arachnid
dog
gopher
rat
tiger
3
oak
maple
elm

样例输出
aloha.arachnid.dog.gopher.rat.tiger
***


代码:



/*变相的欧拉回路,
欧拉回路是构成一个圆,
而此题没有构成一个圆,
所以出度比比入度大1;
*/
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
#include<vector>
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define C_C(x) while(x--)
using namespace std;
const int maxn=1010;
const int inf=0x3f3f3f3f;
struct node
{
int begin;
int end;
char s[33];
};
node pp[maxn];
int degree_in[maxn],degree_out[maxn],id[maxn],n;
bool vised[maxn];

void init()
{
mem(degree_in,0);
mem(degree_out,0);
mem(vised,false);
}

int oula()
{
int i,ans=0;
int x1=0,x2=0;
for(i=0;i<26;i++)
{
if(abs(degree_in[i]-degree_out[i])>=2)//这时绝壁构不成欧拉回路
return -1;
else if(degree_in[i]-degree_out[i]==1)
x1++;
else if(degree_in[i]-degree_out[i]==-1)
{
ans=i;
x2++;
}
}
if(x1>1||x2>1)
return -1;
else if(x1==0)
{
for(i=0;i<26;i++)
if(degree_out[i])
return i;
}
else return ans;
}

bool cmp(node a,node b)
{
return strcmp(a.s,b.s)<0;
}

bool dfs(int st,int cnt)//判断哪几组数据构成欧拉回路。
{
int i;
if(cnt==n)
return true;
for(i=0;i<n;++i)
{
if(pp[i].begin<st||vised[i])
continue;
else if(pp[i].begin>st)
return false;
vised[i]=true;
id[cnt]=i;
if(dfs(pp[i].end,cnt+1))
return true;
vised[i]=false;
}
return false;
}

int main()
{
int T;
int len,i,start;
SI(T);
C_C(T)
{
init();
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",pp[i].s);
len=strlen(pp[i].s);
pp[i].begin=pp[i].s[0]-'a';
pp[i].end=pp[i].s[len-1]-'a';
degree_in[pp[i].end]++;
degree_out[pp[i].begin]++;
}
start=oula();
if(start==-1)
{
printf("***\n");
continue;
}
sort(pp,pp+n,cmp);
if(!dfs(start,0))
{
printf("***\n");
continue;
}
printf("%s",pp[id[0]].s);
for(i=1;i<n;i++)
printf(".%s",pp[id[i]].s);
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: