题意:

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

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

这题...

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. java访问数据库步骤详解

    eg1: public static void main(String[] args) throws ClassNotFoundException, SQLException { //第一步:加载JD ...

  2. PMP项目管理学习笔记(3)——过程框架

    所有项目,不论大小,都可以分解为过程组: 如果项目规模很大,可以分阶段管理,每个阶段都要经过上面的五个过程组,从启动到收尾. 阶段的类型: 顺序阶段: 一个阶段完成后进入下个阶段. 重叠阶段: 有时需 ...

  3. 在Github上删除一个项目

    最近在Github上浏览,不小心fork了一个项目.想删除,现在记录下来. 1.点击选择fork的项目,以gubai为例 2.进入后,点击Settings 3.进入页面后,点击Delete this ...

  4. NSMutableDictionary 排序问题

    NSMutableDictionary 默认情况下是按字母的顺序进行排序的 (a-z)的默认排序如何自定义排序呢? 第一种,利用数组的sortedArrayUsingComparator调用 NSCo ...

  5. 1-1 编程基础 GCC程序编译

    GCC简介      Linux系统下的gcc是GNU推出的强大.性能优越的多平台编译器,是GNU的代表作之一.gcc可以在多种硬体平台上编译出可执行程序,其执行效率与一般的编译器相比平局效率要高20 ...

  6. 总结vue2.0 配置的实例方法

    总结vue2.0 配置的实例方法 http://www.php.cn/js-tutorial-369603.html

  7. webpack打包 css文件里面图片路径 替换位置

    { test: /\.css$/, use: ExtractTextPlugin.extract({ use: ['css-loader?minimize', 'autoprefixer-loader ...

  8. python爬虫---从零开始(四)BeautifulSoup库

    BeautifulSoup是什么? BeautifulSoup是一个网页解析库,相比urllib.Requests要更加灵活和方便,处理高校,支持多种解析器. 利用它不用编写正则表达式即可方便地实现网 ...

  9. 最小生成树 Prim算法 Kruskal算法实现

    最小生成树定义 最小生成树是一副连通加权无向图中一棵权值最小的生成树. 在一给定的无向图 G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即,而 w(u, v) 代表此边的 ...

  10. 对数组内容使用了json_encode返回汉字内容返回了空值

    如果使用json_encode对数组进行转成JSON字符串时候,发现汉字的全部为空,这样可以说明的一点是你的页面上用的一定不是UTF8编码,在PHP手册中对json_encode中待编码的值已经说明所 ...