题意:

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

解析:

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

这题让我对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. 由javascript的闭包引申到程序语言编译上的自由变量作用域的考量

    function foo() { var x = 10; return function bar() { console.log(x); }; } // "foo"返回的也是一个f ...

  2. Linux上vim编辑器缩进的设置(方便如书写python代码)

    因为刚刚安装了Ubuntu虚拟机,知乎大神推荐用VIM编辑器,然后发现在Python缩进上不方便,查了点资料,整理出来,以便自己以后忘了还可以再看看. 第一步: 打开终端,在终端上输入 vim ~/. ...

  3. 51NOD1522 上下序列/CF567F Mausoleum DP

    题目传送门:http://codeforces.com/problemset/problem/567/F 大致题意:你有$1$到$N$的所有正整数每个数两个,现在需要你将它排成一个序列,使得序列为单峰 ...

  4. kettle学习笔记——插件的安装与使用

    一.概述 暂略 二.ODPS插件 https://yq.aliyun.com/articles/68911

  5. 电脑一直报PCIE BUS错误的原因

    报错 新装Linux 系统后,每隔数分钟则报以下错误: AER:Corrected error received: 0000:00:1c:4 pcie bus error: severity=Corr ...

  6. 【译】快速起步-JSX简介

    react version: 15.5.0 快速起步-JSX简介 思考这个变量申明: const element = <h1>Hello, world!</h1>; 这个有趣的 ...

  7. Java中clone的写法

    Cloneable这个接口设计得十分奇葩,不符合正常人的使用习惯,然而用这个接口的人很多也很有必要,所以还是有必要了解一下这套扭曲的机制.以下内容来自于对Effective Java ed 2. it ...

  8. (10)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Ocelot+Identity Server

    用 JWT 机制实现验证的原理如下图:  认证服务器负责颁发 Token(相当于 JWT 值)和校验 Token 的合法性. 一. 相关概念 API 资源(API Resource):微博服务器接口. ...

  9. 记录网件r6220路由器登录配置

    1.设置本地连接为自动获取ip和DNS地址 2.使用网线连接电脑和路由器的LAN口 3.http://routerlogin.net/BRS_index.htm 4.用户名和密码: admin pas ...

  10. centos7.4下Jira6环境部署及破解操作记录(完整版)

    废话不多说,以下记录了Centos7针对Jira6的安装,汉化,破解的操作过程,作为运维笔记留存. 0) 基础环境 192.168.10.212 Centos7.4 mysql 5.6 jdk 1.8 ...