POJ 2337 【字典序】【欧拉回路】
题意:
给你一些单词,判断这些单词能否在保证首尾单词相同的情况下连成一排。
如果有多组解,输出字典序最小的一组解。
这题...
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 【字典序】【欧拉回路】的更多相关文章
- poj1041 John's trip——字典序欧拉回路
题目:http://poj.org/problem?id=1041 求字典序欧拉回路: 首先,如果图是欧拉图,就一定存在欧拉回路,直接 dfs 即可,不用 return 判断什么的,否则TLE... ...
- poj 2337 欧拉回路输出最小字典序路径 ***
把26个小写字母当成点,每个单词就是一条边. 然后就是求欧拉路径. #include<cstdio> #include<iostream> #include<algori ...
- POJ 2337 Catenyms(欧拉回(通)路:路径输出+最小字典序)
题目链接:http://poj.org/problem?id=2337 题目大意:给你n个字符串,只有字符串首和尾相同才能连接起来.请你以最小字典序输出连接好的单词. 解题思路:跟POJ1386一个意 ...
- poj 2337 && zoj 1919 欧拉回路+连通性判断
题目要求按字典序排列,而且可能有重边 所以一开始就将数组从大到小排列,那么我将字符串加入链表时就会令小的不断前移,大的被挤到后面 这里有一点问题就是我一开始使用的是qsort: int cmp(con ...
- Catenyms POJ - 2337(单词+字典序输出路径)
题意: 就是给出几个单词 看能否组成欧拉回路或路径 当然还是让输出组成的最小字典序的路 解析: 还是把首尾字母看成点 把单词看成边 记录边就好了 这题让我对fleury输出最小字典序又加深了一些 ...
- poj 1041(字典序输出欧拉回路)
John's trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8641 Accepted: 2893 Spe ...
- POJ 2337 欧拉回路
题意: 如果给出的单词能够首尾相接,请按字典序输出单词,中间要加'.' 否则输出三个"*". 思路: 欧拉回路 记得按字典序排序哦~ 加边的时候要倒着加.(邻接表遍历的时候是反着的 ...
- POJ 2337 Catenyms (有向图欧拉路径,求字典序最小的解)
Catenyms Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8756 Accepted: 2306 Descript ...
- POJ 2337 Catenyms (欧拉回路)
Catenyms Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8173 Accepted: 2149 Descript ...
随机推荐
- SEO 第八章
SEO第八章 本次课目标: 1. 网站外部优化的外链优化 2. 网站流量分析 1. 什么叫做外链? 外链也叫反向链接,指的是从别的网站指向我自己的网站的链接. 2. 外链的作用? l 外链可 ...
- Python 语言规范
Python 语言规范 pychecker 对你的代码运行pychecker 定义: pychecker 是一个在Python 源代码中查找bug 的工具. 对于C 和C++这样的不那 么动态的( ...
- php bz2扩展安装
php bz2扩展安装 2017年09月22日 14:14:36 Cookie_1030 阅读数:1781 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn ...
- linux 复制文件夹内所有文件到另一个文件夹
cp -Rf /home/user1/* /root/temp/将 /home/user1目录下的所有东西拷到/root/temp/下而不拷贝user1目录本身.即格式为:cp -Rf 原路径/ 目的 ...
- 有n个整数,使其前面各数顺序向后移n-m个位置,最后m个数变成最前面的m个数
题目:有n个整数,使其前面各数顺序向后移n-m个位置,最后m个数变成最前面的m个数 public class 第三十六题数组向后移m个位置 { public static void main(Stri ...
- SQL Server 2008 阻止保存要求重新创建表的更改
取消[阻止保存要求重新创建表的更改]复选框
- ARP 协议
1. 什么是ARP协议? 网络层以上的协议用IP地址来标识网络接口,但以太数据帧传输时,以物理地址来标识网络接口.因此我们需要进行IP地址与物理地址之间的转化.对于IPv4来说,我们使用ARP地址解析 ...
- UVa-133-救济金发放
这题的话,我们首先对于移动函数可以知道,因为只是顺逆的关系,也就是加一或者减一,所以我们每次移动的时候,都补上一个小于n的最大整数,然后取模,这样就不会有负数,而且加之后的结果不会超过2*n,所以我们 ...
- Centos7 安装 MySQL8以及远程访问的配置
Centos7 安装MySQL8 1. 添加MySQL8的本地源 执行以下命令获取安装MySQL源 [root@virde ~]# wget https://repo.mysql.com//mysql ...
- CentOS 6及7 丢失root密码解决方案
6.x系列 法一:使用光盘镜像 BIOS中设置CD-ROM启动——选择救援模式——系统被自动挂载到/mnt/sysimage下——选择进入shell start shell——进入shell命令行—— ...