Poj 2337 Catenyms(有向图DFS求欧拉通路)
题意:
给定n个单词, 问是否存在一条欧拉通路(如acm,matal,lack), 如果存在, 输出字典序最小的一条。
分析:
这题可以看作http://www.cnblogs.com/Jadon97/p/7210278.html升级版本(那题只问是否存在, 这题需要输出路径)
判断有向图的欧拉通路, 主要用到出入度的判定和连通性。
有向图欧拉通路判定方法:图连通;除2个端点外其余节点入度=出度;1个端点入度比出度大1;一个端点入度比出度小1 或 所有节点入度等于出度
DFS求解算法:选择一个正确的起点,用DFS算法遍历所有的边(每条边只遍历一次),遇到走不通就回退。在搜索前进方向上将遍历过的边按顺序记录下来,这组边的排列就组成了一条欧拉通路或者回
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
string word[];
struct node
{
int to, index;
node(int _to, int _index): to(_to), index(_index) {};
};
vector<node> G[];
int degree[], vis[], used[], ans[];
int n, tot;
int st;
int id(int a)
{
return a - 'a';
}
void dfs(int u)
{
// cout << word[index] << "\n";
for(int i = ; i < G[u].size(); i++)
{
int v = G[u][i].to, index = G[u][i].index;
if(!vis[index])
{
vis[index] = ;
dfs(v);
ans[tot++] = index;
}
}
}
bool judge()
{
int cc1 = , cc2 = ; //cc1 出度>入度 cc2 入度>出度
for(int i = ; i < ; i++)
{
if(used[i])
{
if(degree[i] != )
{
if(degree[i] == )
{
cc1++, st = i;//如果出度大于入度, 那么以该点为起点
}
else if(degree[i] == -)
{
cc2++;
}
else
{
return false;
}
}
}
}
if((cc1 || cc2) && cc1 + cc2 != ) //有出度入度不等的点, 而且不止2个
{
return false;
}
return true;
}
int main()
{
// freopen("1.txt","r", stdin);
int T;
cin >> T;
while(T--)
{
for(int i = ; i < ; i++)
G[i].clear();
memset(used, , sizeof(used));
memset(vis, , sizeof(vis));
memset(degree, , sizeof(degree));
tot = ; cin >> n;
for(int i = ; i < n; i++)
{
cin >> word[i];
} sort(word, word + n);
st = ;
for(int i = ; i < n; i++)
{
int u = id(word[i][]), v = id(word[i][word[i].size()-]);
G[u].push_back(node(v,i));
if(u < st)
st = u; //从字典序最小的开始遍历
used[u] = used[v] = ; //记录u,v是用过的
degree[u]++, degree[v]--; //出度++, 入度--
} if(!judge())
{
printf("***\n");
continue;
}
dfs(st);
if(tot != n) //不连通
{
printf("***\n");
continue;
} else
{
cout << word[ans[tot-]];
for(int i = tot - ; i >= ; i--)//反向输出路径
{
cout <<"." << word[ans[i]] ;
}
puts("");
}
}
}
Poj 2337 Catenyms(有向图DFS求欧拉通路)的更多相关文章
- ACM/ICPC 之 DFS求解欧拉通路路径(POJ2337)
判断是欧拉通路后,DFS简单剪枝求解字典序最小的欧拉通路路径 //Time:16Ms Memory:228K #include<iostream> #include<cstring& ...
- poj 2513 连接火柴 字典树+欧拉通路 好题
Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 27134 Accepted: 7186 ...
- POJ 2337 Catenyms (欧拉图)
本文链接http://i.cnblogs.com/EditPosts.aspx?postid=5402042 题意: 给你N个单词,让你把这些单词排成一个序列,使得每个单词的第一个字母和上一个字单词的 ...
- POJ 2337 Catenyms(有向图的欧拉通路)
题意:给n个字符串(3<=n<=1000),当字符串str[i]的尾字符与str[j]的首字符一样时,可用dot连接.判断用所有字符串一次且仅一次,连接成一串.若可以,输出答案的最小字典序 ...
- POJ 1300 欧拉通路&欧拉回路
系统的学习一遍图论!从这篇博客开始! 先介绍一些概念. 无向图: G为连通的无向图,称经过G的每条边一次并且仅一次的路径为欧拉通路. 如果欧拉通路是回路(起点和终点相同),则称此回路为欧拉回路. 具有 ...
- hdu1116有向图判断欧拉通路判断
Play on Words Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- POJ 1386 Play on Words(有向欧拉通路 连通图)
题意 见下方中文翻译 每一个单词能够看成首尾两个字母相连的一条边 然后就是输入m条边 推断是否能构成有向欧拉通路了 有向图存在欧拉通路的充要条件: 1. 有向图的基图连通: 2. 全部点的出度和 ...
- Colored Sticks POJ - 2513 并查集+欧拉通路+字典树hash
题意:给出很多很多很多很多个棒子 左右各有颜色(给出的是单词) 相同颜色的可以接在一起,问是否存在一种 方法可以使得所以棒子连在一起 思路:就是一个判欧拉通路的题目,欧拉通路存在:没奇度顶点 或者 ...
- POJ 2337 Catenyms(有向欧拉图:输出欧拉路径)
题目链接>>>>>> 题目大意: 给出一些字符串,问能否将这些字符串 按照 词语接龙,首尾相接 的规则 使得每个字符串出现一次 如果可以 按字典序输出这个字符串 ...
随机推荐
- 1-docker基础
docker有三个基本概念:镜像/容器/仓库 镜像:一个完整的root文件系统,但并非一个iso的打包文件,而是使用分层存储.构建镜像时,是一层一层的.新的镜像,也可以在原有镜像上添加新层. 容器:是 ...
- AtCoder Grand Contest 015 C - Nuske vs Phantom Thnook
题目传送门:https://agc015.contest.atcoder.jp/tasks/agc015_c 题目大意: 现有一个\(N×M\)的矩阵\(S\),若\(S_{i,j}=1\),则该处为 ...
- MySQL优化步骤和my.cnf优化配置
1.查看机器配置,指三大件:cpu.内存.硬盘 2.查看mysql配置参数 3.查看mysql运行状态,可以用mysqlreport工具来查看 4.查看mysql的慢查询 依次解决了以上问题之后,再来 ...
- Springboot + Websocket + Sockjs + Stomp + Vue + Iview 实现java后端日志显示在前端web页面上
话不多说,看代码. 一.pom.xml 引入spring boot websocket依赖 <dependency> <groupId>org.springframework. ...
- 一键修改android 字体和图片大小.
项目中需要动态更改 app的字体和图片, 在查阅中找到的更改主题的解决办法,和单独的修改字体的方法. 这两种方法的确有效果但是实现麻烦,在修改字体的过程中,找到一个额外的方法, 修改字体的实现更改 ...
- Javascript异步编程的常用方法
Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任 ...
- MFC技术积累——基于MFC对话框类的那些事儿5
4. 菜单 4.1 弹出菜单 本节主要讲解如何在主对话框的指定区域内通过鼠标右击来弹出一个菜单选项.最终效果图如图4.1. 如图4.1鼠标只能在指定区域(图中深色区域)内右击时弹出菜单,在指定区域外点 ...
- (转)Spring4.2.5+Hibernate4.3.11组合开发
http://blog.csdn.net/yerenyuan_pku/article/details/52887573 搭建和配置Spring与Hibernate整合的环境 今天我们来学习Spring ...
- 浅谈p值(p-value是什么)
当我们说到p-value时,我们在说什么? “这个变量的p-value小于0.05,所以这个变量很重要” ........ 你真的知道自己在说什么么???这个p-value到底是个什么鬼?为什么小于0 ...
- // mounted: {}, 原来是 空方法 导致了 vue 的警告 !| [Vue warn]: Error in mounted hook: "TypeError: handlers[i].call is not a function"
// mounted: {}, 原来是 空方法 导致了 vue 的警告 !| vue.runtime.esm.js?2b0e:587 [Vue warn]: Error in mounted hook ...