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 ...
随机推荐
- ios项目中引用其他开源项目
1. 将开源项目的.xcodeproj拖入项目frameworks 2. Build Phases下 Links Binary With Libraries 引入.a文件.Target Depende ...
- Selenium私房菜系列3 -- Selenium API参考手册【ZZ】
大家在编写测试案例想查阅Selenium API说明时,可以查阅本文,否则请跳过! (注:这里API版本比较老,新版本的Selenium的API在这里不一定能找到.) Selenium API说明文档 ...
- hdu 5402 Travelling Salesman Problem (技巧,未写完)
题意:给一个n*m的矩阵,每个格子中有一个数字,每个格子仅可以走一次,问从(1,1)走到(n,m) 的路径点权之和. 思路: 想了挺久,就是有个问题不能短时间证明,所以不敢下手. 显然只要n和m其中一 ...
- SQLite-And和OR运算符
SQLite - AND 和 OR 运算符 SQLite AND . OR运算符用于编译多个条件缩小在一个SQLite声明中选定的数据.这两个操作符被称为连接的操作符. 这些操作符与不同操作提供了一种 ...
- 【整理】iview Tree数据格式问题,无限递归树处理数据
iview Tree数据格式问题,无限递归树处理数据 https://juejin.im/post/5b51a8a4e51d455d6825be20
- 初探node.js
一.定义及优势 定义:Node.js是一个基于 Chrome V8 引擎 的 JavaScript 运行时,它以事件驱动为基础实现了非阻塞模型. 优势:由于Web场景下的大多数任务(静态资源读取.数据 ...
- mybatis-使用junit测试与main方法测试结果不一致问题
今天使用ieda写mybatis程序感觉太不友好了,而且也没找到问题所在.问题:写的user.xml中的语句与输出的语句不一样.尝试了各种办法都没有解决. mybatis配置的使用的查询实体.xml ...
- 下划线hover下动态出现技巧
酷炫的动画效果往往更能吸引眼球,下面我将分享纯CSS中,hover的时候出现下划线动态飞入的技巧. 1.下划线从左侧飞入: div::before{ content:""; wid ...
- [POJ] 3539 Elevator
http://poj.org/problem?id=3539 给定一个电梯,可以上升a,b,c层和回到1层,给定楼高h,求可达层数 lyd讲的同余类BFS,方法是先把三个量压成两个,即把h%a,因为对 ...
- 解决Spellchecker inspection helps locate typos and misspelling in your code
idea出现这个是因为词库中没有这个单词,所以提示拼写错误 解决办法:双击下面有虚线的单词——>鼠标右键——>spelling——>save 'xxx' to distionary