题意:

给你一些单词,判断这些单词能否在保证首尾单词相同的情况下连成一排。

如果有多组解,输出字典序最小的一组解。

这题...

WA了两天。

错误有以下:

1.没有初始化好起始位置,默认起始位置是a了。想想想如果单词中都不带a开头的不就傻逼了吗。

2.没有理解好字典序,觉得只要保证每次都从尽量小的字母开始往下搜索就可以了,其实不然,我这样只是使得我下次找到的字母字典序最小而没有保证我本次找到的字母是字典序最小的。譬如若同时存在ab和aba我会优先搜索aba,但是事实上ab的字典序更小。

#include<stdio.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
int n;
queue<string>pho[];
bool ok[];
int me[];
int in[];
int out[];
string tmp[];
queue<int>jilu[][];
stack<int>s;
int snum;
int tmps[];
void dfs(int x)
{
s.push(x);
if(!pho[x].empty())
{
string meme=pho[x].front();
pho[x].pop();
dfs(meme[meme.length()-]-);
}
}
int findme(int a)
{
if(a!=me[a])
return me[a]=findme(me[a]);
return a;
}
void Fleury(int x)
{
snum=;
s.push(x);
while(!s.empty())
{
int b=;
if(!pho[s.top()].empty())
{
b=;
}
if(b==)
{
tmps[snum++]=s.top();
s.pop();
}
else
{
int y=s.top();
s.pop();
dfs(y);
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
int start=;
memset(ok,,sizeof(ok));
for(int i=; i<=; i++)
{
me[i]=i;
}
while(!s.empty())
s.pop();
memset(out,,sizeof(out));
memset(in,,sizeof(in));
for(int i=; i<=; i++)
{
while(!pho[i].empty())
{
pho[i].pop();
}
for(int j=; j<=; j++)
{
while(!jilu[i][j].empty())
{
jilu[i][j].pop();
}
}
}
cin>>n;
for(int i=; i<=n; i++)
{
cin>>tmp[i];
}
sort(tmp+,tmp++n);
for(int i=; i<=n; i++)
{
if(start>min((int)tmp[i][]-,(int)tmp[i][tmp[i].length()-]-))
start=min((int)tmp[i][]-,(int)tmp[i][tmp[i].length()-]-);
pho[tmp[i][]-].push(tmp[i]);
jilu[tmp[i][]-][tmp[i][tmp[i].length()-]-].push(i);
in[tmp[i][tmp[i].length()-]-]++;
out[tmp[i][]-]++;
ok[tmp[i][]-]=;
ok[tmp[i][tmp[i].length()-]-]=;
int tmpxx=findme((int)(tmp[i][]-));
int tmpyy=findme((int)(tmp[i][tmp[i].length()-]-));
if(tmpxx!=tmpyy)
me[tmpyy]=tmpxx;
}
int x=,y=,z=;
for(int i=; i<=; i++)
{
if(ok[i])
{
if(in[i]==out[i])
continue;
else if(in[i]==out[i]+)
x++;
else if(out[i]==in[i]+)
{
y++;
start=i;
}
else
z++;
}
}
int myt=;
for(int i=; i<=; i++)
{
if(ok[i])
{
if(me[i]==i)
myt++;
}
}
//printf("%d %d %d %d\n",x,y,z,myt);
if(z||myt>)
printf("***\n");
else if((y==&&x==)||(x==&&y==))
{
Fleury(start);
for(int i=snum-; i>=; i--)
{
cout<<tmp[jilu[tmps[i+]][tmps[i]].front()];
jilu[tmps[i+]][tmps[i]].pop();
if(i)
printf(".");
}
printf("\n");
}
else
printf("***\n");
}
}

POJ 2337 【字典序】【欧拉回路】的更多相关文章

  1. poj1041 John's trip——字典序欧拉回路

    题目:http://poj.org/problem?id=1041 求字典序欧拉回路: 首先,如果图是欧拉图,就一定存在欧拉回路,直接 dfs 即可,不用 return 判断什么的,否则TLE... ...

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

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

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

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

  4. poj 2337 && zoj 1919 欧拉回路+连通性判断

    题目要求按字典序排列,而且可能有重边 所以一开始就将数组从大到小排列,那么我将字符串加入链表时就会令小的不断前移,大的被挤到后面 这里有一点问题就是我一开始使用的是qsort: int cmp(con ...

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

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

  6. poj 1041(字典序输出欧拉回路)

    John's trip Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8641   Accepted: 2893   Spe ...

  7. POJ 2337 欧拉回路

    题意: 如果给出的单词能够首尾相接,请按字典序输出单词,中间要加'.' 否则输出三个"*". 思路: 欧拉回路 记得按字典序排序哦~ 加边的时候要倒着加.(邻接表遍历的时候是反着的 ...

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

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

  9. POJ 2337 Catenyms (欧拉回路)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8173   Accepted: 2149 Descript ...

随机推荐

  1. codevs 2600 13号星期几?

    时间限制: 1 s  空间限制: 8000 KB  题目等级 : 黄金 Gold 题目描述 Description 从1900年1月1日(星期一) 开始经过的n年当中,每个月的13号这一天是星期一.星 ...

  2. C++_pthread read-write lock_读写锁_visual studio 2015下配置

    pthread下载地址:https://sourceware.org/pthreads-win32/ 1. 项目->属性->VC++目录 包含目录里添加:pthread所在路径\pthre ...

  3. uva1613 K-Graph Oddity

    题目要求k>=最大度数:观察,颜色数量和度数的关系,得颜色数=最大度数+1(偶数)//最大度数(奇数) 可以满足染色关系一个点和周围的点的颜色数加起来最大为它的度数+1: k=所有点中最大的度. ...

  4. react开启一个项目 webpack版本出错

    npx create-react-app my-app cd my-app npm start 在命令行里执行以上语句就可(前两天刚刚发现,最新版的react对webpack的版本要了新要求,大概是他 ...

  5. 创建线程的三种方式_Callable和Runnable的区别

    Java 提供了三种创建线程的方法 通过实现Runnable接口 通过继承Thread接口 通过Callable和Future创建线程 通过实现 Runnable 接口来创建线程 public cla ...

  6. UITextView与UITextfield的区别

    IOS中的UITextView和UITextField都是文本输入控件并都能够调用系统键盘.本次特酷把介绍UITextView和UITextField的区别.简单来说,UITextView和UITex ...

  7. 牛客OI赛制测试赛2 A 无序组数

    链接:https://www.nowcoder.com/acm/contest/185/A来源:牛客网 题目描述 给出一个二元组(A,B) 求出无序二元组(a,b) 使得(a|A,b|B)的组数 无序 ...

  8. 框架之---Django

    Django是功能最为健全的一个WEB框架,但就因为过于健全,显得过于臃肿.但是Django中最为正要的就是Middleware.ORM和From表单. Django之web本质 Django之初 D ...

  9. 【HIHOCODER 1325】 平衡树·Treap

    描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说的是哪两个啊? 小Ho:就是二叉排序树和堆啊,你看这两种数据结构都是构造了一个二叉树,一个节点有一个父亲和两个儿子. 如果 ...

  10. p3386 二分图匹配模板

    https://www.luogu.org/problemnew/show/P3386 可以只做一边的匹配 #include <bits/stdc++.h> using namespace ...