/*
NYOJ 99单词拼接:
思路:欧拉回路或者欧拉路的搜索!
注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE!
有向图的欧拉路:abs(In[i] - Out[i])==1(入度[i] - 出度[i])的节点个数为两个
有向图的欧拉回路:所有的节点都有In[i]==Out[i]
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; struct node{
char s[];
int first, end;
}; bool cmp(node a, node b){
return strcmp(a.s, b.s) <;
} node nd[];
int In[], Out[];
int order[], vis[];
int n; int fun(){
memset(vis, , sizeof(vis));
int i;
int last=-;
int first=-;
//有向图欧拉路的判断
for(i=; i<; ++i)
{
if(In[i]!=Out[i])
{ //首先入度和出度之差的绝对值为 1的节点的要么没有,要么只有两个(没有欧拉回路,只有欧拉路)!
if(Out[i]-In[i]== && first==-)
first=i;
else if(Out[i]-In[i]==- && last==-)
last=i;
else
return -;
}
}
if(first>- && last>-) //这种情况是 欧拉路的搜索 !
return first;
else if(first==- && last==-) //这种是欧拉回路的搜索!
{
for(i=; i<; ++i)
if(In[i]!=)
return i;
}
else
return -;
} bool dfs(int st, int cnt){
if(cnt == n)
return true;
int ld=, rd=n-;
while(ld<=rd){
int mid=(ld+rd)/;
if(nd[mid].first<st)
ld=mid+;
else rd=mid-;
}
int m=rd+;
if(nd[m].first > st) return false;
for(int i=m; i<n; ++i)
if(!vis[i]){
if(nd[i].first > st)
return false;
if(nd[i].first == st){
vis[i]=;
order[cnt]=i;
if(dfs(nd[i].end, cnt+)) return true;
vis[i]=;
}
}
return false;
} int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
memset(In, , sizeof(In));
memset(Out, , sizeof(Out));
for(int i=; i<n; ++i){
scanf("%s", nd[i].s);
nd[i].first=nd[i].s[]-'a';
nd[i].end=nd[i].s[strlen(nd[i].s)-]-'a';
++Out[nd[i].first];
++In[nd[i].end];
} int st = fun();
//因为搜索的是字典序的第一个,所以将字符串从小到大排一下序!在搜索的时候按照升序搜索组合!
sort(nd, nd+n, cmp);
if(st==- || !dfs(st, ))
printf("***\n");
else{
printf("%s", nd[order[]].s);
for(int i=; i<n; ++i)
printf(".%s", nd[order[i]].s);
printf("\n");
}
}
return ;
}

NYOJ 99单词拼接(有向图的欧拉(回)路)的更多相关文章

  1. nyoj 99 单词拼接

    点击打开链接 单词拼接 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同 ...

  2. CF36 E Two Paths——欧拉(回)路

    题目:http://codeforces.com/contest/36/problem/E 给定一张无向图,要求输出两条欧拉路覆盖所有边: 分类讨论,首先判-1:有两个以上连通块 / 有四个以上奇度数 ...

  3. POJ 2337 Catenyms(有向图的欧拉通路)

    题意:给n个字符串(3<=n<=1000),当字符串str[i]的尾字符与str[j]的首字符一样时,可用dot连接.判断用所有字符串一次且仅一次,连接成一串.若可以,输出答案的最小字典序 ...

  4. NYIST 99 单词拼接

    单词拼接时间限制:3000 ms | 内存限制:65535 KB难度:5 描述给你一些单词,请你判断能否把它们首尾串起来串成一串.前一个单词的结尾应该与下一个单词的道字母相同.如 aloha dog ...

  5. POJ 1780 Code(有向图的欧拉通路)

    输入n(1<=n<=6),输出长度为10^n + n -1 的字符串答案. 其中,字符串以每n个为一组,使得所有组都互不相同,且输出的字符串要求字典序最小. 显然a[01...(n-1)] ...

  6. Poj 2337 Catenyms(有向图DFS求欧拉通路)

    题意: 给定n个单词, 问是否存在一条欧拉通路(如acm,matal,lack), 如果存在, 输出字典序最小的一条. 分析: 这题可以看作http://www.cnblogs.com/Jadon97 ...

  7. HDU1116 Play on Words(有向图欧拉通路)

    我把单词当作点,然后这样其实是不对的,这样就要判定是否是哈密顿通路.. 这题应该把单词的首尾单词当作点,而单词本身就是边,那样就是判定欧拉通路了. 有向图包含欧拉通路的充要条件是:首先基图连通,然后是 ...

  8. Uva 10129 - Play on Words 单词接龙 欧拉道路应用

    跟Uva 10054很像,不过这题的单词是不能反向的,所以是有向图,判断欧拉道路. 关于欧拉道路(from Titanium大神): 判断有向图是否有欧拉路 1.判断有向图的基图(即有向图转化为无向图 ...

  9. GCD nyoj 1007 (欧拉函数+欧几里得)

    GCD  nyoj 1007 (欧拉函数+欧几里得) GCD 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 The greatest common divisor ...

随机推荐

  1. 笔记:java转XML

    package com.deppon.oms.module.client.pushToTianFangkeji.domain; import java.util.ArrayList; import j ...

  2. 转帖:Python应用性能分析指南

    原文:A guide to analyzing Python performance While it’s not always the case that every Python program ...

  3. web.xml详解

    web.xml的作用 web.xml,一个Tomcat工程中最重要的配置文件.web.xml没有其实也可以----只要你确定你的项目里面不需要任何过滤器.监听器.Servlet等等.我试了一下,没有w ...

  4. 设计模式之美:Role Object(角色对象)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Role Object 的示例实现. 意图 通过明确地附加角色对象到目标对象中,以使对象可以适配不同的客户需求.每个角色对象都代 ...

  5. Linux及文件系统基本介绍

    Linux及文件系统基本介绍 1   互联网行业现状 在服务器端市场: 超级计算机 2014年11月的数据显示前500系统中的485个系统都在运行着 Linux 的发布系统,而仅仅只有一台运行着 Wi ...

  6. 作业八—Alpha阶段项目总结

    一.项目的预期目标: 我们的图书管理系统之前的目标是做出可以让读者和管理员采用不同的搜索方式,并且时要做到读者和管理者两种不同的方式的!但是我们目前做到了部分搜索方式和管理员界面,主要原因是该项目如果 ...

  7. Wix 安装部署教程(八) 自动生成XML小工具

    这个功能类似于Heat.exe,指定文件夹,生成对应的WIX标签.Winform做的,代码简单,生成的标签需要粘贴到对应的目录才能使用,并不是一步到位. 需要设定两个参数,一个是文件夹路径,一个是文件 ...

  8. JavaScript思维导图—运算符

    JavaScript思维导图-来自@王子墨http://julying.com/blog/the-features-of-javascript-language-summary-maps/

  9. 两个Fragment之间如何传递数据

    FragmentA启动FragmentB,做一些选择操作后,返回FragmentA,需要把FragmentB里面选择的数据传回来.有什么办法? Fragment之间不能直接通信,必须通过Activit ...

  10. Azure China (9) 在Azure China配置CDN服务

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China Update 2015-11-20:Azure China CDN服 ...