POJ 2337 输出欧拉路径
太无语了。
这道题做了一整天。
主要还是我太弱了。
以后这个就当输出欧拉路径的模版吧。
题目中的输出字典序最小我有点搞不清楚,看了别人是这么写的。但是我发现我过不了后面DISCUSS里面的数据。
题意理解问题还是题目问题?
这道题大致以下分几步吧。
判断图是否连通,用并查集判断即可。
判断图是否有欧拉回路或者通路,判断出度和入度即可,若是欧拉通路,找出起点。
DFS找出欧拉路径输出。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2505
#define inf 1<<28
#define LL(x) ( x << 1 )
#define RR(x) ( x << 1 | 1 )
#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define mp(a,b) make_pair(a,b)
#define PII pair<int,int>
#define N 10005
using namespace std; inline void RD(int &ret) {
char c;
do {
c = getchar();
} while(c < '0' || c > '9') ;
ret = c - '0';
while((c=getchar()) >= '0' && c <= '9')
ret = ret * 10 + ( c - '0' );
}
inline void OT(int a) {
if(a >= 10)OT(a / 10) ;
putchar(a % 10 + '0') ;
} char a[N] ;
vector<string>g[300] ;
int in[N] ,out[N] ;
int vis[N] ;
int f[N] ;
int n ;
int first ; int find(int x) {
return f[x] == x ? x : f[x] = find(f[x]) ;
} void Union(int a ,int b) {
a = find(a) ;
b = find(b) ;
if(a == b)return ;
if(a > b)f[a] = b ;
else f[b] = a ;
} void init() {
mem(in , 0) ;
mem(out ,0) ;
for (int i = 0 ; i < 260 ; i ++ )f[i] = i ;
for (int i = 0 ; i < 260 ; i ++ )g[i].clear() ;
first = 0 ;
mem(vis, 0) ;
} stack<string>ans ;
void dfs(int now ){
int sz = g[now].size() ;
while(g[now].size() > 0){
string nn = g[now][0] ;
int tt = g[now][0][g[now][0].size() - 1] - 'a' ;
g[now].erase(g[now].begin()) ;
dfs(tt) ;
ans.push(nn) ;
}
}
int main() {
int T ;
#ifndef ONLINE_JUDGE
freopen("D:\\acm.txt","r",stdin) ;
#endif
cin >> T ;
while(T -- ) {
cin >> n ;
init() ;
for (int i = 1 ; i <= n ; i ++ ) {
scanf("%s",a) ;
int s = a[0] - 'a' ;
int e = a[strlen(a) - 1] - 'a' ;
out[s] ++ ;
in[e] ++ ;
g[s].push_back(a) ;
Union(s , e) ;
vis[s] = vis[e] = 1 ;
}
int fnum = 0 ;
int dnum = 0 ;
bool flag = 0 ;
int st = -1 ;
for (int i = 0 ; i < 26 ; i ++ ) {
if(!vis[i])continue ;
if(i == find(i))fnum ++ ;
if(in[i] - out[i] == 1){
dnum ++ ;
}
if(out[i] - in[i] == 1){
dnum ++ ;
st = i ;
}
if(abs(out[i] - in[i]) >= 2){
flag = 1 ;
}
}
if((dnum == 1 || dnum > 2) ||(flag) || (fnum != 1)) {
puts("***") ;
continue ;
}
else{
for (int i = 0 ;i < 26; i ++ ){
if(st == -1 && vis[i])st = i ;//如果是欧拉回路,则找到字典序最小的起点。
sort(g[i].begin() , g[i].end()) ;
}
while(!ans.empty())ans.pop() ;
dfs(st) ;
printf("%s",ans.top().c_str()) ;
ans.pop() ;
while(!ans.empty()){
printf(".%s",ans.top().c_str()) ;
ans.pop() ;
}
puts("") ;
}
}
return 0 ;
}
POJ 2337 输出欧拉路径的更多相关文章
- poj 2337 有向图输出欧拉路径
Catenyms Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10186 Accepted: 2650 Descrip ...
- POJ 2337 Catenyms(有向欧拉图:输出欧拉路径)
题目链接>>>>>> 题目大意: 给出一些字符串,问能否将这些字符串 按照 词语接龙,首尾相接 的规则 使得每个字符串出现一次 如果可以 按字典序输出这个字符串 ...
- POJ 2337 Catenyms(欧拉回(通)路:路径输出+最小字典序)
题目链接:http://poj.org/problem?id=2337 题目大意:给你n个字符串,只有字符串首和尾相同才能连接起来.请你以最小字典序输出连接好的单词. 解题思路:跟POJ1386一个意 ...
- poj 2337 Catenyms 【欧拉路径】
题目链接:http://poj.org/problem?id=2337 题意:给定一些单词,假设一个单词的尾字母与还有一个的首字母同样则能够连接.问能否够每一个单词用一次,将全部单词连接,能够则输出字 ...
- POJ 2337 Catenyms (有向图欧拉路径,求字典序最小的解)
Catenyms Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8756 Accepted: 2306 Descript ...
- poj 2337 欧拉回路输出最小字典序路径 ***
把26个小写字母当成点,每个单词就是一条边. 然后就是求欧拉路径. #include<cstdio> #include<iostream> #include<algori ...
- Catenyms POJ - 2337(单词+字典序输出路径)
题意: 就是给出几个单词 看能否组成欧拉回路或路径 当然还是让输出组成的最小字典序的路 解析: 还是把首尾字母看成点 把单词看成边 记录边就好了 这题让我对fleury输出最小字典序又加深了一些 ...
- poj 2337(单向欧拉路的判断以及输出)
Catenyms Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11648 Accepted: 3036 Descrip ...
- POJ 2337 Catenyms
http://poj.org/problem?id=2337 题意: 判断给出的单词能否首尾相连,输出字典序最小的欧拉路径. 思路: 因为要按字典序大小输出路径,所以先将字符串排序,这样加边的时候就会 ...
随机推荐
- 《STL源代码分析》---stl_list.h读书笔记
STL在列表list它是一种经常使用的容器.list不连续双向链表在内存,而且是环形. 理解列表如何操作的详细信息,然后.阅读STL名单上的代码是最好的方法. G++ 2.91.57.cygnus\c ...
- int有符号和无符号类型内存 -- C
/* int 有符号 0xffffffff == -1 0xfffffffe == -2 最小 0x80000000 == -21 4748 3648 最大 0x7fffffff == 21 4748 ...
- SOA、REST 和六边形架构
SOA.REST 和六边形架构 上一篇:<IDDD 实现领域驱动设计-架构之经典分层> 阅读目录: SOA-面向服务架构 REST 与 RESTful 资源(Resources) 状态(S ...
- c# WebBrowser开发参考资料
原文:c# WebBrowser开发参考资料 c# WebBrowser开发参考资料,所有资料的采集均来自网上 话说有了WebBrowser类,终于不用自己手动封装SHDocVw的AxWebBrows ...
- Php设计模式(三):行为型模式part2
原文详见:http://www.ucai.cn/blogdetail/7023?mid=1&f=5 可以在线运行查看效果哦! <接上文> 5.中介者模式(Mediator) : 用 ...
- asp.net [AjaxMethod]
AjaxPro.2.dll cs 代码 using AjaxPro; Utility.RegisterTypeForAjax(typeof(BOMdr_KT)); [Ajax.AjaxMethod() ...
- Python超级明星WEB框架Flask
Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug和模 ...
- Windows 7的 磁盘管理中,某个磁盘或分区,突然变成只读。
1.今天突然发现E盘无法创建文件夹.文件,也不可以改,感觉像是变成只读 . 2.我的电脑 -> 计算机管理 -> 存储 -> 磁盘管理,发现E盘下面标记着只读两个字. 3.由于我的E ...
- Ubuntu12.10无法安装openssh-server[已解决]
因为要在Ubuntu下搞些东西,家里的台式有Deepin2013,但是发现有很多依赖的问题,实在不想解决,就到win7下用VBox安装了Ubuntu.打算使用SourceCRT连接虚拟机,但是在安装在 ...
- [翻译]如何编写GIMP插件(二)
写在前面: 本人翻译并不专业,甚至英语不好,翻译内容仅供参考.由于博主是边学边翻译,所以不能保证翻译的准确性和正确性,如果可以,请查看原版学习,本文仅作学习记录之用. <How to write ...