题意:

  就是给出几个单词 看能否组成欧拉回路或路径  当然还是让输出组成的最小字典序的路

解析:

  还是把首尾字母看成点   把单词看成边 记录边就好了

这题让我对fleury输出最小字典序又加深了一些认识

fleury输出最小字典序  就必须保证对应输出的边或点  按从小到大的顺序去走

所以我们先保存  然后排序  然后从大到小加边

因为我们用的是邻接表  邻接表是从当前起点u的最后一个加入的边 开始的 。。所以我们要对应起来

把边从大到小依次加入

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <cctype>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <bitset>
#define rap(i, a, n) for(int i=a; i<=n; i++)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define lap(i, a, n) for(int i=n; i>=a; i--)
#define lep(i, a, n) for(int i=n; i>a; i--)
#define rd(a) scanf("%d", &a)
#define rlld(a) scanf("%lld", &a)
#define rc(a) scanf("%c", &a)
#define rs(a) scanf("%s", a)
#define pd(a) printf("%d\n", a);
#define plld(a) printf("%lld\n", a);
#define pc(a) printf("%c\n", a);
#define ps(a) printf("%s\n", a);
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _ ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = , INF = 0x7fffffff, LL_INF = 0x7fffffffffffffff;
int in[maxn], out[maxn], f[maxn];
int n, s, cnt, tot;
int head[maxn], stk[maxn], vis[maxn];
string str[maxn];
struct node
{
int u, v, next, flag, id;
}Node[maxn]; void add(int u, int v, int id)
{
Node[cnt].u = u;
Node[cnt].v = v;
Node[cnt].id = id;
Node[cnt].flag = ;
Node[cnt].next = head[u];
head[u] = cnt++;
} void dfs(int u)
{
for(int i = head[u]; i != -; i = Node[i].next)
{
if(!Node[i].flag)
{
Node[i].flag = ;
dfs(Node[i].v);
stk[tot++] = Node[i].id;
}
} } void print()
{
int sh = ;
for(int i = tot - ; i >= ; i--)
{
if(sh++) printf(".");
cout << str[stk[i]];
}
printf("\n");
} int find(int x)
{
return f[x] == x ? x : (f[x] = find(f[x]));
} void init()
{
mem(in, );
mem(out, );
mem(vis, );
mem(head, -);
cnt = tot = ;
for(int i = ; i < maxn; i++) f[i] = i;
} int main()
{
int T;
rd(T);
while(T--)
{
init();
rd(n);
for(int i = ; i <= n; i++)
cin >> str[i];
sort(str + , str + n + );
for(int i = n; i >= ; i--)
{
int u = str[i][] - 'a' + ; int v = str[i][str[i].size() - ] - 'a' + ;
vis[u] = vis[v] = ;
add(u, v, i);
in[v]++, out[u]++;
int l = find(u), r = find(v);
if(l != r) f[l] = r;
}
int cnt1 = , cnt2 = , cnt3 = , flag = ;
int x = find(str[][] - 'a' + );
s = str[][] - 'a' + ;
for(int i = ; i <= ; i++)
{
if(!vis[i]) continue;
if(find(i) != x) flag = ;
if(in[i] != out[i]) cnt3++;
if(in[i] + == out[i]) cnt1++, s = i;
if(out[i] + == in[i]) cnt2++;
}
if(!flag && (cnt3 == || cnt3 == && cnt1 == && cnt2 == ))
{
dfs(s);
print();
}
else
printf("***\n"); } return ;
}

Catenyms POJ - 2337(单词+字典序输出路径)的更多相关文章

  1. hdu Minimum Transport Cost(按字典序输出路径)

    http://acm.hdu.edu.cn/showproblem.php? pid=1385 求最短路.要求输出字典序最小的路径. spfa:拿一个pre[]记录前驱,不同的是在松弛的时候.要考虑和 ...

  2. POJ 2337 【字典序】【欧拉回路】

    题意: 给你一些单词,判断这些单词能否在保证首尾单词相同的情况下连成一排. 如果有多组解,输出字典序最小的一组解. 这题... WA了两天. 错误有以下: 1.没有初始化好起始位置,默认起始位置是a了 ...

  3. 迷宫问题 POJ - 3984 (搜索输出路径)

    题目大意 题目不需要大意,poj居然还有中文题 鸣谢 特别鸣谢ljc大佬提供的方法!!! 解法 我们可能输出个最短路径的长度比较简单,但是输出最短路径真的是没有做过,这里有一种简单的方法 因为我们的d ...

  4. Day 4 -E - Catenyms POJ - 2337

    A catenym is a pair of words separated by a period such that the last letter of the first word is th ...

  5. poj 3414 Pots(bfs+输出路径)

    Description You are given two pots, having the volume of A and B liters respectively. The following ...

  6. HD1385Minimum Transport Cost(Floyd + 输出路径)

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  7. POJ 2337 Catenyms(欧拉回(通)路:路径输出+最小字典序)

    题目链接:http://poj.org/problem?id=2337 题目大意:给你n个字符串,只有字符串首和尾相同才能连接起来.请你以最小字典序输出连接好的单词. 解题思路:跟POJ1386一个意 ...

  8. POJ 2337 Catenyms(有向欧拉图:输出欧拉路径)

    题目链接>>>>>> 题目大意: 给出一些字符串,问能否将这些字符串  按照 词语接龙,首尾相接  的规则 使得每个字符串出现一次 如果可以 按字典序输出这个字符串 ...

  9. POJ 2337 Catenyms

    http://poj.org/problem?id=2337 题意: 判断给出的单词能否首尾相连,输出字典序最小的欧拉路径. 思路: 因为要按字典序大小输出路径,所以先将字符串排序,这样加边的时候就会 ...

随机推荐

  1. POJ3301 Texas Trip 计算几何、随机化贪心

    传送门--Vjudge 三分写法似乎有问题,可以去Udebug上看Morass的\(666\)个测试点的数据,我的乱搞有很多比正解答案小,但还是能在SPOJ和POJ过,可见数据之水. 可以对正方形的角 ...

  2. CF1039E Summer Oenothera Exhibition 贪心、根号分治、倍增、ST表

    传送门 感谢这一篇博客的指导(Orzwxh) $PS$:默认数组下标为$1$到$N$ 首先很明显的贪心:每一次都选择尽可能长的区间 不妨设$d_i$表示在取当前$K$的情况下,左端点为$i$的所有满足 ...

  3. Nowcoder186C 失衡天平 背包

    题目传送门 题意:给你$N$个数,你可以将其划分为若干对集合(这里所说的集合允许数字重复)(即集合是两个集合两个集合出现),每对集合中两个集合所有元素的和的差的绝对值不超过$M$,可以有数字不在集合内 ...

  4. 字符串中去除多余的空格保留一个(C#)

    在C#的字符串,其中有许多空格,现要求是把多余的空格去除保留一个.原理是使用Split()方法进行分割,分割有一个选项是RemoveEmptyEntries,然后再把分割后的字符串Join起来. st ...

  5. javascript调用ActiveX接口失败的解决方案及使用心得

    前段时间公司做了个比较大的项目,需要用到ocx控件,我厂大部分项目都采用C#.net,而winform程序条用ocx控件接口是相对简单的,但是javascript调用ocx接口,却和winform的用 ...

  6. Log4net_配置

    Log4net 有三个主要组件:loggers,appenders 和 layouts.这三个组件一起工作使得开发者能够根据信息类型和等级(Level)记录信息,以及在运行时控制信息的格式化和信息的写 ...

  7. Promise 原理

    异步:可同时好几件事,互不影响: 同步:按循序一件一件.... 异步好多缺点:.... promise就是解决异步计算的这些缺点的,主要用于: 1.异步计算: 2.可以将异步操作队列化  按期望的顺序 ...

  8. 量产救U盘

    同事U盘不能格式化,快速格式化失败,非快速格式化也失败.就问谁有360安全软件,试试能不能格式化. 我说我有火绒,但是不知道火绒并没有格式化U盘的功能(应该没有吧,反正我找了以后没找到) 那怎么办呢? ...

  9. shell脚本--逻辑判断与字符串比较

    涉及到比较和判断的时候,要注意 整数比较使用-lt,-gt,ge等比较运算符,详情参考:整数比较 文件测试使用 -d, -f, -x等运算发,详情参考:文件测试 逻辑判断使用    && ...

  10. C++拷贝控制

    一.拷贝控制操作 ​ 当定义一个类时,显示或隐式地指定了此类型的对象在拷贝.赋值和销毁时所执行的操作,通过三个特殊的成员函数来控制这些操作,分别是拷贝构造函数,赋值运算符和析构函数.拷贝构造函数定义了 ...