题干:

A catenym is a pair of words separated by a period such that the last letter of the first word is the same as the last letter of the second. For example, the following are catenyms:

dog.gophergopher.ratrat.tigeraloha.alohaarachnid.dog

A compound catenym is a sequence of three or more words separated by periods such that each adjacent pair of words forms a catenym. For example,

aloha.aloha.arachnid.dog.gopher.rat.tiger

Given a dictionary of lower case words, you are to find a compound catenym that contains each of the words exactly once.

Input

The first line of standard input contains t, the number of test cases. Each test case begins with 3 <= n <= 1000 - the number of words in the dictionary. n distinct dictionary words follow; each word is a string of between 1 and 20 lowercase letters on a line by itself.

Output

For each test case, output a line giving the lexicographically least compound catenym that contains each dictionary word exactly once. Output "***" if there is no solution.

Sample Input

2
6
aloha
arachnid
dog
gopher
rat
tiger
3
oak
maple
elm

Sample Output

aloha.arachnid.dog.gopher.rat.tiger
***

题目大意:

给n个字符串,让你串成一个串,要求输出顺序,如果多解要求字典序最小

解题报告:

不用并查集判连通,用dfs判连通就行了。注意路径记录的时候要先dfs再回溯记录,因为可能有这种情况。

所以你需要再倒回来路径的时候记录路径,因为首先欧拉通路他只有一个终点(再也走不动的地方),你最后走不动了回溯的时候着一定是倒着回溯的,最后倒着输出就行了。

再就是注意搜索的起点:

(1)如果发现所有节点的出度与入度都相等,那么有向图中存在欧拉回路,当然也一定存在欧拉通路了。这时以任一节点开始深搜一条路径即可。(因为字典序要求最小我们就从出现的字符集中最小的那个字母开始搜)
(2)如果发现存在 out[i] - in[i] == 1 的节点,那么欧拉通路是以out[i] - in[i] == 1的那个 i 为始点的,以 in[i] - out[i] == 1 的那个 i 为终点。这时我们要以这个out[i] - in[i] == 1 的节点为起点开始深搜。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<string,int> PSI;
const int MAX = 1000 + 5;
string s[MAX];
int n;
string ans[MAX];
int len[MAX],in[MAX],out[MAX],tot;
bool vis[MAX];
vector<PSI> vv[129];
void dfs(char st) {int up = vv[st].size();for(int i = 0; i<up; i++) {PSI cur = vv[st][i];if(vis[cur.S]) continue;vis[cur.S] = 1;       dfs(cur.F[len[cur.S]-1]);       ans[++tot] = cur.F;}
}
int main()
{int t;cin>>t;while(t--) {tot=0;scanf("%d",&n);for(int i = 1; i<=127; i++) in[i]=out[i]=0,vv[i].clear();for(int i = 1; i<=n; i++) {vis[i] = 0;cin>>s[i];len[i] = s[i].length();}char minn = 'z';for(int i = 1; i<=n; i++) {          char st = s[i][0];char ed = s[i][len[i]-1];vv[st].pb(pm(s[i],i));in[ed]++;out[st]++;minn = min(minn,ed);minn = min(minn,st);}int flag = 1,ru=0,chu=0;for(int i = 'a'; i<='z'; i++) {sort(vv[i].begin(),vv[i].end());if(!in[i] && !out[i]) continue;if(in[i] == out[i]) continue;else if(in[i] - out[i] == 1) ru++;else if(out[i] - in[i] == 1) chu++,minn=i;else {flag = 0;break;}}if(flag == 0 || ru>1 || chu>1 || ru!=chu) puts("***");else {dfs(minn);if(tot != n) puts("***");else {for(int i = n; i>=1; i--) {if(i != n) printf(".");cout << ans[i];}puts("");}}} return 0 ;
}

总结:提问,如果要求输出欧拉回路的路径咋办?答:在起点那里稍微判断一下就行了。或者最后直接输出起点。因为既然是欧拉回路的话可以以任何一个点为起点,所以你钦点的起点最后一定可以绕回来,所以最后输出答案的时候先输出一遍起点就可以。或者在dfs的时候稍微记录一下起点。

【POJ - 2337】Catenyms(欧拉图相关,欧拉通路输出路径,tricks)相关推荐

  1. 图论 —— 图的遍历 —— 欧拉通路与欧拉回路问题

    [基本概念] 欧拉通路:通过图中所有边一次且仅一次行遍所有顶点的通路 欧拉回路:通过图中所有边一次且仅一次行遍所有顶点的回路 欧拉图:具有欧拉回路的图 半欧拉图:具有欧拉通路而无欧拉回路的图 奇度点: ...

  2. 欧拉回路 欧拉通路 欧拉回路图

    来源 一.定义 对于无向图: 1) 设G是连通无向图,则称经过G的每条边一次并且仅一次的路径为欧拉通路: 2) 如果欧拉通路是回路(起点和终点是同一个顶点),则称此回路为欧拉回路(Euler circ ...

  3. 欧拉图——欧拉通路和欧拉回路

    定义: 欧拉通路 (欧拉迹):通过图中每条边且只通过一次,并且经过每一顶点的通路. 欧拉回路 (欧拉闭迹):通过图中每条边且只通过一次,并且经过每一顶点的回路. 欧拉图:存在欧拉回路的图. 简单说欧拉 ...

  4. 欧拉通路、欧拉回路、欧拉图和半欧拉图以及 Hierholzer 算法

    概念:欧拉通路(又称欧拉路径).欧拉回路.欧拉图和半欧拉图 定义 通过图中所有边恰好一次且行遍所有顶点的通路称为欧拉通路(又称欧拉路径). 通过图中所有边恰好一次且行遍所有顶点的回路称为欧拉回路. 具 ...

  5. POJ - 2513 Colored Sticks 欧拉通路+并查集+静态树

    一开始想用map来搞,但是感觉好复杂,然后想了一下看大佬们用trie做的,感觉十分合理就敲了一发. 一开始re,数组要开到550000 只会静态的字典树,在每个根节点看是否出现过改颜色,如果没有就把该 ...

  6. #1176 : 欧拉路·一(欧拉通路的判定)

    #1176 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找 ...

  7. 图系列(四)欧拉通路与欧拉回路

    欧拉通路与欧拉回路 之前,写了图系列一二三,现在出四啦!这也意味着,对于图的部分,可以说50%以上常用的内容就已经过了一遍了.欧拉路的部分会稍微难一点,主要是我们要和定义打交道了.至于其他图的理论,我 ...

  8. ZOJ - 4122 Triangle City(最短路+欧拉通路+思维)

    题目链接:点击查看 题目大意:给出一张三角形的无向图,如下图所示 求出从点 ( 1 , 1 ) 到点 ( n , n ) 找到一条最长路,且每条边至多遍历一次,输出最长路的权值以及路径 题目分析:点 ...

  9. nysit 42 欧拉通路(一笔画图)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=42 题目大意:给你一些点和边,问能否用一笔把这个图画出来,每条边只能画一次 思路:求是否存 ...

最新文章

  1. 学点 C 语言(19): 数据类型 - 数组
  2. Python 查重,统计重复 排序
  3. 007_Buzz事件
  4. 仿windows造字程序的 ASP.NET图片组合生成控件
  5. lotus表单域怎么获取视图结果_翻译案例 | 商业推广类文章怎么翻?如何修改译文?...
  6. ARM AMBA 外围设备 的datasheet
  7. 【Python3练习题 019】 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。...
  8. 88.http反向代理proxy处理请求的流程
  9. python glob用法
  10. 浏览网页隐藏图片 html,Html、Js实现网页图片切换及隐藏
  11. ps计算机二级自学教程,计算机二级考试《Photoshop图像处理与制作》
  12. wlan消失 网络适配器文件夹空了 设备管理器黄色感叹号 wifi那里看不到任何WiFi解决
  13. 根据url 在ensembl 网站爬取外显子等数据
  14. 中小企业的需求管理软件都有哪些
  15. 系统优化与lvs详解配置、haproxy
  16. Docker 1.12.1初体验
  17. 【openstack-rally】使用rally执行tempest api测试并导出测试报告
  18. 反思:项目开发中的语言沟通与文档沟通
  19. java static void_今天终于搞懂了:为什么 Java 的 main 方法必须是 public static void?...
  20. 100个python算法超详细讲解:牛顿迭代法求方程根

热门文章

  1. Apple`s Steve Jobs Has Reshaped(重塑) the Tech World: 10 Ways He Did It
  2. 使用SDL打造游戏世界之入门篇 - 7
  3. 对比 SQL Server 2005 和 Oracle
  4. 解读设计模式----命令模式(Command Pattern)
  5. cad直线和圆弧倒角不相切_曲线操作-直线,圆弧,圆,倒斜角
  6. json java typeof_Json对象与Json字符串的转化、JSON字符串与Java对象的转换
  7. lua 调用文件中的函数调用_深入Lua:调用相关的指令
  8. 中文邮件营销html模版,怎么制作邮件营销模板?— —邮件格式
  9. java 默认排序方式_Java Collections.sort()实现List排序的默认方法和自定义方法
  10. Snap svg:路径变换和相交计算