题意:

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

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

这题...

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. VPS环境配置预备篇

    VPS买到手了,在配置环境前要做哪些操作呢?老谢说一下自己的习惯,希望对和老谢一样的菜鸟有帮助更新系统内核和rpm包#安装yum-fastestmirror插件yum -y install yum-f ...

  2. codevs 1043 方格取数 2000年NOIP全国联赛提高组

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而 ...

  3. c++调用com口操作autocad

    #include "stdafx.h" #include <atlcomcli.h> #import "D:\\C++test\\FirstCom\\Rele ...

  4. C++友元函数和运算符重载

    非成员友元函数.成员友元函数和友元类 1.友元的作用: (1)友元提供了不同类的成员函数之间.类的成员函数与一般函数之间进行了数据共享的机制: 2.友元的优点和缺点 优点:提高程序的运行效率: 缺点: ...

  5. MySQL-01 MySQL数据库安装指南

    学习要点 MySQL数据库的安装和设置 下载mysql mysql官网:https://www.mysql.com/downloads/ 主要版本: Oracle MySQL Cloud Servic ...

  6. Spring框架针对dao层的jdbcTemplate操作crud之update修改数据库操作

    使用jdbcTemplate 原理是把加载驱动Class.forName("com.mysql.jdbc.Driver"); 和连接数据库Connection conn=Drive ...

  7. centos7 rsync+inotify软件实现集群服务的数据备份(二)

    上一篇文章记录了怎么安装rsync以及怎么使用该服务备份数据,但是在集群中需要实时备份客户发过来的相关数据,这样在使用命令或者定时任务的方式执行备份, 就满足不了整个服务的需求了. inotify是一 ...

  8. CentOS6.8下安装Docker

    原文章链接https://www.cnblogs.com/baolong/p/5743420.html. 由于在自己安装的虚拟机上打开linux终端命令行输入uname -a 以及cat /etc/r ...

  9. tiny4412学习笔记-将uboot、zImage、文件系统烧到emmc中 (转)

    http://blog.chinaunix.net/uid-30025978-id-4788683.html 1.首先还是要将u-boot写入SD卡中从SD卡启动. 使用读卡器将SD插入电脑中,使用u ...

  10. python_time和datetime模块

    time和datatime模块 时间相关的操作,时间有三种表示方式: 时间戳               1970年1月1日之后的秒,即:time.time() 格式化的字符串    2019-1-1 ...