Catenyms POJ - 2337(单词+字典序输出路径)
题意:
就是给出几个单词 看能否组成欧拉回路或路径 当然还是让输出组成的最小字典序的路
解析:
还是把首尾字母看成点 把单词看成边 记录边就好了
这题让我对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(单词+字典序输出路径)的更多相关文章
- hdu Minimum Transport Cost(按字典序输出路径)
http://acm.hdu.edu.cn/showproblem.php? pid=1385 求最短路.要求输出字典序最小的路径. spfa:拿一个pre[]记录前驱,不同的是在松弛的时候.要考虑和 ...
- POJ 2337 【字典序】【欧拉回路】
题意: 给你一些单词,判断这些单词能否在保证首尾单词相同的情况下连成一排. 如果有多组解,输出字典序最小的一组解. 这题... WA了两天. 错误有以下: 1.没有初始化好起始位置,默认起始位置是a了 ...
- 迷宫问题 POJ - 3984 (搜索输出路径)
题目大意 题目不需要大意,poj居然还有中文题 鸣谢 特别鸣谢ljc大佬提供的方法!!! 解法 我们可能输出个最短路径的长度比较简单,但是输出最短路径真的是没有做过,这里有一种简单的方法 因为我们的d ...
- 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 ...
- poj 3414 Pots(bfs+输出路径)
Description You are given two pots, having the volume of A and B liters respectively. The following ...
- HD1385Minimum Transport Cost(Floyd + 输出路径)
Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- POJ 2337 Catenyms(欧拉回(通)路:路径输出+最小字典序)
题目链接:http://poj.org/problem?id=2337 题目大意:给你n个字符串,只有字符串首和尾相同才能连接起来.请你以最小字典序输出连接好的单词. 解题思路:跟POJ1386一个意 ...
- POJ 2337 Catenyms(有向欧拉图:输出欧拉路径)
题目链接>>>>>> 题目大意: 给出一些字符串,问能否将这些字符串 按照 词语接龙,首尾相接 的规则 使得每个字符串出现一次 如果可以 按字典序输出这个字符串 ...
- POJ 2337 Catenyms
http://poj.org/problem?id=2337 题意: 判断给出的单词能否首尾相连,输出字典序最小的欧拉路径. 思路: 因为要按字典序大小输出路径,所以先将字符串排序,这样加边的时候就会 ...
随机推荐
- 二、java三大特性--继承
在讲解之前我们先看一个例子 Husband.java public class Husband { private String name; private String sex; privatein ...
- u-boot全面分析
uboot主Makefile分析1 uboot住Makefile分析参考:https://www.2cto.com/kf/201607/522424.html uboot version确定(Make ...
- CF888G Xor-MST 生成树、分治、Trie树合并
传送门 第一次接触到Boruvka求最小生成树 它的原版本是:初始每一个点构成一个连通块,每一次找到每一个连通块到其他的连通块权值最短的边,然后合并这两个连通块.因为每一次连通块个数至少减半,所以复杂 ...
- BZOJ1185 HNOI2007 最小矩形覆盖 凸包、旋转卡壳
传送门 首先,肯定只有凸包上的点会限制这个矩形,所以建立凸包. 然后可以知道,矩形上一定有一条边与凸包上的边重合,否则可以转一下使得它重合,答案会更小. 于是沿着凸包枚举这一条边,通过旋转卡壳找到离这 ...
- Iterable接口
Iterable接口 总览 这个接口用来表明可以进行迭代.具体的迭代方式,可以通过iterator()方法获取到一个迭代器,在迭代器中会实现如何获取下一个元素,以及是否迭代结束. java8中源码如下 ...
- 数列分块入门九题(三):LOJ6283~6285
Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此 ...
- [Spark][Python]对HDFS 上的文件,采用绝对路径,来读取获得 RDD
对HDFS 上的文件,采用绝对路径,来读取获得 RDD: In [102]: mydata=sc.textFile("file:/home/training/test.txt")1 ...
- 从源码的角度看 React JS 中批量更新 State 的策略(下)
这篇文章我们继续从源码的角度学习 React JS 中的批量更新 State 的策略,供我们继续深入学习研究 React 之用. 前置文章列表 深入理解 React JS 中的 setState 从源 ...
- 『编程题全队』Beta 阶段冲刺博客二
1.提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID) (1) 昨天已完成的工作 孙志威: 1.添加了SubTask类,完成基本UI 2.为SubTask类添加了展开/收缩 ...
- Activiti Rest API tutorial
http://192.168.66.182:8080/activiti-rest/service/repository/deployments/ {"data":[{"i ...