POJ2337 欧拉路径字典序输出
题意:
给一些单词,问是否可以每个单词只用一次,然后连接在一起(不一定要成环,能连接在一起就行)。
思路:
这个题目的入手点比较好想,其实就是问欧拉路径,先说下解题步骤,然后在细说
(1) 把每个单词看成一条边,单词的首字母和尾字母是点
(2) 然后记录入度,出度,根据入度出度判断是不是欧拉路径或者回路
(3) 别往了判断所有点是不是属于同一个连通子集,这个可以用并查集啥的
(4) 把所有的边都排序下,至于是什么顺序,根据自己的存图方式去排
(5) 欧拉路径就从头开始(要是欧拉回路就找个最小的点)深搜找出路径
之前也没写过输出欧拉路径啥的啊!看有人说可以用栈递归存边,然后就在纸上画了几个8想想,觉得有道理,就自己写了一个欧拉路的(其实很简单),至于排序的地方,我想的是直接在存边之前先把边排序下,因为欧拉路径输出的时候也是比较简单“画6的感觉”,要求字典序最小,因为我用的是前向星,其实这个东西建边是倒叙的,就是a-b a-c a-d 的顺序进去,那么访问的时候是a-d,a-c,a-b这样的,全都是抱着试一试,结果直接a了。虽然是简单题,但是挺高兴啊。
#include<stack>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N_node 30
#define N_edge 1000 + 100
using namespace std;
typedef struct
{
int to ,next;
}STAR;
typedef struct
{
char str[30];
}EDGE;
STAR E[N_edge];
EDGE edge[N_edge];
int list[N_node] ,tot;
int mer[N_node];
int mark[N_edge];
int deg[N_node];
stack<int>mysk;
bool camp(EDGE a ,EDGE b)
{
return strcmp(a.str ,b.str) > 0;
}
void add(int a ,int b)
{
E[++tot].to = b;
E[tot].next = list[a];
list[a] = tot;
}
int finds(int x)
{
return x == mer[x] ? x : mer[x] = finds(mer[x]);
}
void DFS(int s)
{
for(int k = list[s] ;k ;k = E[k].next)
{
if(mark[k]) continue;
mark[k] = 1;
DFS(E[k].to);
mysk.push(k);
}
}
int main ()
{
int t ,n ,i ,j;
int mkc[30];
scanf("%d" ,&t);
while(t--)
{
scanf("%d" ,&n);
memset(deg ,0 ,sizeof(deg));
memset(mkc ,0 ,sizeof(mkc));
for(i = 1 ;i <= 26 ;i ++)
mer[i] = i;
for(i = 1 ;i <= n ;i ++)
{
scanf("%s" ,edge[i].str);
int a = edge[i].str[0] - 'a' + 1;
int b = edge[i].str[strlen(edge[i].str)-1] - 'a' + 1;
mer[finds(a)] = finds(b);
mkc[a] = mkc[b] = 1;
deg[a] ++;
deg[b] --;
}
int s = 0 ,z = 0 ,f = 0 ,min;
for(i = 1 ;i <= 26 ;i ++)
{
if(mkc[i])
{
if(mer[i] == i) s ++;
if(!deg[i]) continue;
if(deg[i] == 1)
z ++ ,min = i;
else if(deg[i] == -1) f ++;
else s ++;
}
}
if(s != 1 || f + z != 0 && f + z != 2)
{
printf("***\n");
continue;
}
sort(edge + 1 ,edge + n + 1 ,camp);
memset(list ,0 ,sizeof(list));
tot = 1;
for(i = 1 ;i <= n ;i ++)
{
int a = edge[i].str[0] - 'a' + 1;
int b = edge[i].str[strlen(edge[i].str)-1] - 'a' + 1;
add(a ,b);
}
if(z + f == 0) min = edge[n].str[0] - 'a' + 1;
while(!mysk.empty())
mysk.pop();
memset(mark ,0 ,sizeof(mark));
DFS(min);
while(!mysk.empty())
{
int tou = mysk.top();
mysk.pop();
if(mysk.empty())
printf("%s\n" ,edge[tou-1].str);
else printf("%s." ,edge[tou-1].str);
}
}
return 0;
}
POJ2337 欧拉路径字典序输出的更多相关文章
- ZOJ 3204 Connect them(字典序输出)
主要就是将最小生成树的边按字典序输出. 读取数据时,把较小的端点赋给u,较大的端点号赋值给v. 这里要用两次排序,写两个比较器: 第一次是将所有边从小到大排序,边权相同时按u从小到大,u相同时按v从小 ...
- poj 1041(字典序输出欧拉回路)
John's trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8641 Accepted: 2893 Spe ...
- 二叉排序树:HUD3999-The order of a Tree(二叉排序树字典序输出)
The order of a Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- poj 1041 John's trip——欧拉回路字典序输出
题目:http://poj.org/problem?id=1041 明明是欧拉回路字典序输出的模板. 优先队列存边有毒.写跪.学习学习TJ发现只要按边权从大到小排序连边就能正常用邻接表了! 还有一种存 ...
- UVA 796 - Critical Links 无向图字典序输出桥
题目:传送门 题意:给你一个无向图,你需要找出里面的桥,并把所有桥按字典序输出 这一道题就是用无向图求桥的模板就可以了. 我一直错就是因为我在输入路径的时候少考虑一点 错误代码+原因: 1 #incl ...
- 拓扑排序详解(梅开二度之dfs版按字典序输出拓扑路径+dfs版输出全部拓扑路径
什么是拓扑排序? 先穿袜子再穿鞋,先当孙子再当爷.这就是拓扑排序! 拓扑排序说白了其实不太算是一种排序算法,但又像是一种排序(我是不是说了个废话qwq) 他其实是一个有向无环图(DAG, Direct ...
- poj2337 欧拉路径
poj2337 这道题昨天晚上开始做,今天才A.但是问题想透了, 发现其实没那么难 题目大意: 给你一些单词,如果一个单词的末尾字符与另一个单词首字符相同,则两个的单词可以连接.问是否可以把所有单词连 ...
- poj-2337(欧拉回路输出)
题意:给你n个字符串,每个字符串可以和另一个字符串连接的前提是,前一个字符串的尾字符等于后一个字符串的首字符,问你存不存在欧拉通路并输出 解题思路:基本标准流程,建图:把一个字符串可以看作一条首字符指 ...
- [poj2337]求字典序最小欧拉回路
注意:找出一条欧拉回路,与判定这个图能不能一笔联通...是不同的概念 c++奇怪的编译规则...生不如死啊... string怎么用啊...cincout来救? 可以直接.length()我也是长见识 ...
随机推荐
- 干掉前端!3分钟纯 Java 注解搭个管理系统
大家好,我是小富~ 最近接触到个新项目,发现它用了一个比较有意思的框架,可以说实现了我刚入行时候的梦想,所以这里马不停蹄的和大家分享下. 在我刚开始工作接触的项目都还没做前后端分离,经常需要后端来维护 ...
- LamPiao靶机work_through
前言 oscp靶机系列的第二篇.只追求做出来的话,这靶机蛮简单的.但是为了提升难度,尽量避免使用msf--毕竟考试只准用一次嘛,自己写了个exp. 正文 主机发现 nmap -sP 192.168.2 ...
- 第十届蓝桥杯大赛软件类省赛C/C++研究生组 试题I:灵能传输
在游戏<星际争霸 II>中,高阶圣堂武士作为星灵的重要 AOE 单位,在游戏的中后期发挥着重要的作用,其技能"灵能风暴"可以消耗大量的灵能对一片区域内的敌军造成毁灭性的 ...
- [Fundamental of Power Electronics]-PART II-9. 控制器设计-9.4 稳定性
9.4 稳定性 众所周知的是,增加反馈回路可能会导致原本稳定的系统变得不稳定.尽管原变换器传递函数(式(9.1))以及环路增益\(T(s)\)不包含右半平面极点,但式(9.4)的闭环传递函数仍然可能存 ...
- Java代理模式,一次复习完4种动态代理实现方式
代理模式也是一种非常常见的设计模式.了解Spring框架的都知道,Spring AOP 使用的就是动态代理模式.今天就来系统的重温一遍代理模式. 在现实生活中代理是随处可见的,当事人因某些隐私不方便出 ...
- BUAA_OO_2020_第四单元与课程总结
BUAA_OO_2020_第四单元与课程总结 第四单元架构 第一次 架构设计 第一次作业要求实现UML类图解析器. 我才用自顶向下依次解析的方法,首先将类图中涉及的所有元素分成三层: 第一层 第二层 ...
- 记一次metasploitable2内网渗透之1524端口
0x01.漏洞 许多攻击脚本将安装一个后门SHELL于这个端口,尤其是针对SUN系统中Sendmail和RPC服务漏洞的脚本.如果刚安装了防火墙就看到在这个端口上的连接企图,很可能是上述原因.可以试试 ...
- Centos6无法使用yum解决办法
12月后Centos 6 系统无法使用yum出现错误(文章底部看) 相信已经有一部分朋友今天连接到CentOS 6的服务器后执行yum后发现报错,那么发生了什么? CentOS 6已经随着2020年1 ...
- 虚拟机装好centos7没网解决办法
输入ip查询命名 ip addr 也可以输入 ifconfig(centOs7没有ifconfig命令)查看ip,但此命令会出现3个条目,centos的ip地址是ens33条目中的inet值. 发现 ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之准备安装-09
自动化kolla-ansible部署ubuntu20.04+openstack-victoria之准备安装-09 欢迎加QQ群:1026880196 进行交流学习 准备安装 #controller1 ...