UVA 10441 - Catenyms

题目链接

题意:给定一些单词,求拼接起来,字典序最小的,注意这里的字典序为一个个单词比过去,并非一个个字母

思路:欧拉回路。利用并查集判联通,然后欧拉道路判定,最后dfs输出路径

代码:

#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std; const int N = 30; vector<string> g[N];
vector<string> ans; int t, n, parent[N];
bool used[N][1005]; int find(int x) {
return parent[x] == x ? x : parent[x] = find(parent[x]);
} int vis[N];
int cnt, tot, ru[N], chu[N]; void init() {
memset(ru, 0, sizeof(ru));
memset(chu, 0, sizeof(chu));
memset(vis, 0, sizeof(vis));
memset(used, 0, sizeof(used));
for (int i = 0; i < 26; i++) {
g[i].clear();
parent[i] = i;
}
cnt = 1; tot = 0;
scanf("%d", &n);
string s;
while (n--) {
cin >> s;
int u = s[0] - 'a', v = s[s.length() - 1] - 'a';
if (!vis[u]) {vis[u] = 1; tot++;}
if (!vis[v]) {vis[v] = 1; tot++;}
ru[v]++; chu[u]++;
g[u].push_back(s);
int pu = find(u);
int pv = find(v);
if (pu != pv) {
parent[pu] = pv;
cnt++;
}
}
for (int i = 0; i < 26; i++)
sort(g[i].begin(), g[i].end());
} void dfs(int u) {
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i][g[u][i].length() - 1] - 'a';
if (used[u][i]) continue;
used[u][i] = 1;
dfs(v);
ans.push_back(g[u][i]);
}
} bool solve() {
if (cnt != tot) return false;
int Min = 30;
int odd = 0, st;
for (int i = 0; i < 26; i++) {
if (g[i].size()) Min = min(Min, i);
if (ru[i] - chu[i] == -1) {
odd++;
st = i;
}
else if (chu[i] - ru[i] == -1)
odd++;
else if (chu[i] != ru[i]) return false;
if (odd > 2) return false;
}
ans.clear();
if (!odd) dfs(Min);
else dfs(st);
for (int i = ans.size() - 1; i > 0; i--)
cout << ans[i] << ".";
cout << ans[0] << endl;
return true;
} int main() {
scanf("%d", &t);
while (t--) {
init();
if (!solve()) printf("***\n");
}
return 0;
}

UVA 10441 - Catenyms(欧拉道路)的更多相关文章

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

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

  2. UVa 10129 Play On Words【欧拉道路 并查集 】

    题意:给出n个单词,问这n个单词能否首尾接龙,即能否构成欧拉道路 按照紫书上的思路:用并查集来做,取每一个单词的第一个字母,和最后一个字母进行并查集的操作 但这道题目是欧拉道路(下面摘自http:// ...

  3. UVA 10129 Play on Words(欧拉道路)

    题意:给你n个字符串,问你是否可以出现一条链,保证链中每个字符串的第一个元素与上一个字符串的最后一个元素相同,注意可能重复出现同一个字符串 题解:以每一个字符串第一个元素指向最后一个元素形成一个有向图 ...

  4. 【UVa】12118 Inspector's Dilemma(欧拉道路)

    题目 题目     分析 很巧秒的一道题目,对着绿书瞎yy一会. 联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2.这样不断相加的和加上e再乘以t就是答案, ...

  5. Nyoj42 一笔画问题 (欧拉道路)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=42题目链接 #include <cstdio> #include <cstring ...

  6. 6-14 Inspector s Dilemma uva12118(欧拉道路)

    题意:给出一个国家城市个数n   所需走过道路个数e   每条道路长t   该国家任意两个城市之间都存在唯一道路长t     要求 :找一条最短的路遍历所有所需走过的路 一开始以为是图的匹配  但是好 ...

  7. POJ 2513 Colored Sticks(欧拉道路+字典树+并查集)

    http://poj.org/problem?id=2513 题意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 思路: 题目很明 ...

  8. UVA-10129 Play on Words (判断欧拉道路的存在性)

    题目大意:给出一系列单词,当某个单词的首字母和前一个单词的尾字母相同,则这两个单词能链接起来.给出一系列单词,问是否能够连起来. 题目分析:以单词的首尾字母为点,单词为边建立有向图,便是判断图中是否存 ...

  9. UVA10129———欧拉道路

    题目 输入n(n≤100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如 acm,malform,mouse).每个单词最多包含1000 ...

随机推荐

  1. python链接mysql以及mysql中对表修改的常用语法

    MySQL是一个关系型数据库管理系统 ,其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库.在使用过程中不总是和它打交道,导致使用时候都得 ...

  2. Linux操作命令(二)

    本次实验将介绍 Linux 命令中 mkdir.rm.mv.cp.cat.nl 命令的用法. 1.mkdir mkdir命令用来创建指定名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的 ...

  3. ZSTU OJ 4273 玩具

    枚举,二分,$RMQ$. 肯定是将连续一段中最大值免去花费,枚举起点之后,二分终点即可.可以证明单调性. #include<map> #include<set> #includ ...

  4. 循序渐进PYTHON3(十三) --5-- DJANGO请求处理流程

    上面的流程图可以大致描述Django处理request的流程,可以分为以下几个步骤: 1. 用户通过浏览器请求一个页面 2. 请求到达Request Middlewares,中间件对request做一 ...

  5. 安卓 应用app启动过程

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 从用户点击 Launcher 上的 App 图标,到显示出 App 界面时主要发生的事情.知晓以 ...

  6. 又见Python<3>:Pandas之Series对象的使用

    Pandas是Python下最强大的数据分析和探索库,是基于Numpy库构建的,支持类似SQL的结构化数据的增.删.查.改,具有丰富的数据处理函数.Pandas有两大数据结构:Series和DataF ...

  7. [BZOJ2286][SDOI2011]消耗战(虚树DP)

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4998  Solved: 1867[Submit][Statu ...

  8. wannafly挑战赛14

    第一次打wannafly..觉得自己好菜啊... 题目描述 在三维空间中,平面 x = 0, y = 0, z = 0,以及平面 x + y + z = K 围成了一个三棱锥. 整天与整数打交道的小明 ...

  9. python基础之re,sys,suprocess模块

    re 正则表达式 1.什么是正则? 正则就是用一系列具有特殊含义的字符组成的规则,该规则用来描述具有某一特征的字符串. 正则就是用来在一个大的字符串匹配出符合规则的子字符串 2.为什么用正则? 正则可 ...

  10. PYTHON之爬虫学习(一)基础

    关于python爬虫,大家都很熟悉,那么我就不多说,开始做了. 首先,python爬虫先安装python库,主要是requests库,在windows中cmd中输入,pip install reque ...