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(有向欧拉图:输出欧拉路径)
题目链接>>>>>> 题目大意: 给出一些字符串,问能否将这些字符串 按照 词语接龙,首尾相接 的规则 使得每个字符串出现一次 如果可以 按字典序输出这个字符串 ...
随机推荐
- vue文件中style标签的几个标识符
.vue文件中style标签的几个标识符 在人生就要绝望的时候, 被编辑器所提示的一个scopedSlots所拯救. 卧槽, 写到最后才发现这个属性的具体卵用. 详情见最后解决办法. 问题背景 问题由 ...
- 把AM_B_ENTRY表里的ARCHIVAL_CODE字段,值复制给BA_ARCHIVAL_CODE_160812字段
UPDATE AM_B_ENTRY T SET T.BA_ARCHIVAL_CODE_160812=T.ARCHIVAL_CODE SELECT BA_ARCHIVAL_CODE_160812 FRO ...
- Java-学完一个月总结(javaSe学习路线)
JavaSe的一个月 第一周 0410 基本数据类型:数据类型的转换:运算符:导入删除项目0411 分支结构if else:switch case ;while0412 do while ;for / ...
- 【经验总结】北邮OJ
90. 字符串转换 时间限制 1000 ms 内存限制 65536 KB 题目描述 我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如"aaaa"是一个简单串,而" ...
- BOM学习-javascript计时器小结
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- java.lang.NoSuchMethodError: org.hibernate.cfg.Environment.verifyProperties
我在使用jpa2+spring4+hibernate4 的时候,报错java.lang.NoSuchMethodError: org.hibernate.cfg.Environment.verifyP ...
- CSS3实现单行、多行文本溢出(省略号的形式出现)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 图形学基础 | 实现OBJ文件的载入
1. tiny_obj_loader.h 的使用include这个头文件需要先定义一个宏 #define TINYOBJLOADER_IMPLEMENTATION#include "tiny ...
- Java8函数式编程和lambda表达式
文章目录函数式编程JDK8接口新特性函数接口方法引用函数式编程函数式编程更多时候是一种编程的思维方式,是一种方法论.函数式与命令式编程区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉 ...
- Python 中print 和return 的区别
1.print() print()函数的作用是输出数据到控制台,就是打印在你能看到的界面上. 2.return return语句[表达式]退出函数,选择性地向调用方返回一个表达式.不带参数值的retu ...