太无语了。

这道题做了一整天。

主要还是我太弱了。

以后这个就当输出欧拉路径的模版吧。

题目中的输出字典序最小我有点搞不清楚,看了别人是这么写的。但是我发现我过不了后面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 输出欧拉路径的更多相关文章

  1. poj 2337 有向图输出欧拉路径

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10186   Accepted: 2650 Descrip ...

  2. POJ 2337 Catenyms(有向欧拉图:输出欧拉路径)

    题目链接>>>>>> 题目大意: 给出一些字符串,问能否将这些字符串  按照 词语接龙,首尾相接  的规则 使得每个字符串出现一次 如果可以 按字典序输出这个字符串 ...

  3. POJ 2337 Catenyms(欧拉回(通)路:路径输出+最小字典序)

    题目链接:http://poj.org/problem?id=2337 题目大意:给你n个字符串,只有字符串首和尾相同才能连接起来.请你以最小字典序输出连接好的单词. 解题思路:跟POJ1386一个意 ...

  4. poj 2337 Catenyms 【欧拉路径】

    题目链接:http://poj.org/problem?id=2337 题意:给定一些单词,假设一个单词的尾字母与还有一个的首字母同样则能够连接.问能否够每一个单词用一次,将全部单词连接,能够则输出字 ...

  5. POJ 2337 Catenyms (有向图欧拉路径,求字典序最小的解)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8756   Accepted: 2306 Descript ...

  6. poj 2337 欧拉回路输出最小字典序路径 ***

    把26个小写字母当成点,每个单词就是一条边. 然后就是求欧拉路径. #include<cstdio> #include<iostream> #include<algori ...

  7. Catenyms POJ - 2337(单词+字典序输出路径)

    题意: 就是给出几个单词 看能否组成欧拉回路或路径  当然还是让输出组成的最小字典序的路 解析: 还是把首尾字母看成点   把单词看成边 记录边就好了 这题让我对fleury输出最小字典序又加深了一些 ...

  8. poj 2337(单向欧拉路的判断以及输出)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11648   Accepted: 3036 Descrip ...

  9. POJ 2337 Catenyms

    http://poj.org/problem?id=2337 题意: 判断给出的单词能否首尾相连,输出字典序最小的欧拉路径. 思路: 因为要按字典序大小输出路径,所以先将字符串排序,这样加边的时候就会 ...

随机推荐

  1. 关于JavaScript中计算精度丢失的问题

    摘要: 由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,而JavaScript中没有相应的封装类来处理浮点数运算,直接计算会导致运算精度丢失. 为了避免产生精度差异,把需要计算的数字升级(乘 ...

  2. WPF 辅助开发工具

    原文:WPF 辅助开发工具 以下介绍的工具均为免费版,有些是源代码开放,希望对大家有用. Kaxaml 轻量级XAML 编辑器,可以同时进行图像和XAML 代码的编辑.最终生成开发人员想要的XAML ...

  3. 【百度地图API】如何利用自己的数据制作社交地图?只显示可视区域内的标注

    原文:[百度地图API]如何利用自己的数据制作社交地图?只显示可视区域内的标注 摘要:如果你自己的数据已经超过1万个,如何进行合理的显示?除了聚合marker外,还有一个办法.那就是,只显示可视区域内 ...

  4. JavaWeb显示器

    本文研究的总结.欢迎转载,但请注明出处:http://blog.csdn.net/pistolove/article/details/44310967 A:监听器的定义      专门用于其它对象身上 ...

  5. [Asp.net]站点地图SiteMap

    原文:[Asp.net]站点地图SiteMap 引言 在项目中发现使用站点地图的控件,之前没总结过这方面的东西,就写了一个demo测试了一下,这里记录一下,算是总结吧. Web.sitemap < ...

  6. C语言宏的高级应用

    原文:C语言宏的高级应用 关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号.比如 ...

  7. (64位oracle使用32位的PLSQL)安装64位的oracle数据库软件,使用32位的PLSQL Developer连接方法

    因为PLSQL Developer没有提供64位的,于是依据网上的资料做了一下整理,发上来 1.下载并安装Oracle 11g R2 64位,在server上安装时忽略硬件检測失败信息: 2.下载Or ...

  8. jmeter 控制器

    Critical Section Controller :

  9. webBrowser 参数设置

    //禁用脚本错误等类似的窗口信息 this.webBrowser1.ScriptErrorsSuppressed = true; //禁用右键菜单 this.webBrowser1.IsWebBrow ...

  10. vim的复制粘贴小结

    vim帮助文档里与粘贴板有关的内容如下: vim有12个粘贴板,分别是0.1.2.….9.a.“.+:用:reg命令可以查看各个粘贴板里的内容.在vim中简单用y只是复制到“(双引号)粘贴板里,同样用 ...