判断是欧拉通路后,DFS简单剪枝求解字典序最小的欧拉通路路径

//Time:16Ms     Memory:228K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; #define MAX 1005
#define MAXS 24 //姓名
#define MAXN 26 //字母 struct Edge{
char name[MAXS];
int a,b;
friend bool operator < (Edge &e1, Edge &e2)
{ return strcmp(e1.name, e2.name) < 0; }
}e[MAX]; int n;
int in[MAXN], out[MAXN]; //入度与出度
int order[MAX]; //顺序路径
bool v[MAX]; bool dfs(int x, int rk)
{
if(rk == n) return true;
for(int i = 0; i < n; i++)
{
if(!v[i] && x == e[i].a){
v[i] = true;
order[rk] = i;
if(dfs(e[i].b, rk+1)) return true;
v[i] = false;
}
}
return false;
} int main()
{
//freopen("in.txt","r",stdin); int T;
scanf("%d",&T);
while(T--){
memset(e,0,sizeof(e));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(order,-1,sizeof(order));
memset(v,false,sizeof(v));
scanf("%d",&n);
//构图
int st = 26; //st:起点
for(int i = 0; i < n; i++)
{
scanf("%s",e[i].name);
e[i].a = e[i].name[0] - 'a';
e[i].b = e[i].name[strlen(e[i].name) - 1] - 'a';
out[e[i].a]++;
in[e[i].b]++;
if(e[i].a < st) st = e[i].a;
}
sort(e,e+n);
//欧拉路判定
int odd = 0; //奇度结点个数
bool flag = true;
for(int i = 0 ; i < MAXN; i++)
{
if(in[i] != out[i])
{
odd++;
if(out[i] - in[i] == 1)
st = i;
else if(out[i] - in[i] != -1)
{
flag = false;
break;
}
}
}
if(flag && (odd ==2 || odd == 0) && dfs(st,0)) //满足欧拉通路(排除非连通)+完整路径(判断非连通)
{
for(int i = 0; i < n - 1; i++)
printf("%s.", e[order[i]].name);
printf("%s\n", e[order[n-1]].name);
}
else printf("***\n"); } return 0;
}

ACM/ICPC 之 DFS求解欧拉通路路径(POJ2337)的更多相关文章

  1. ACM/ICPC 之 DFS求解欧拉回路+打表(POJ1392)

    本题可以通过全部n位二进制数作点,而后可按照某点A的末位数与某点B的首位数相等来建立A->B有向边,以此构图,改有向图则是一个有向欧拉回路,以下我利用DFS暴力求解该欧拉回路得到的字典序最小的路 ...

  2. hdu1116有向图判断欧拉通路判断

    Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  3. 欧拉回路&欧拉通路判断

    欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 判断欧拉通路是否存在的方法 ...

  4. POJ 1386 Play on Words(有向欧拉通路 连通图)

    题意  见下方中文翻译 每一个单词能够看成首尾两个字母相连的一条边  然后就是输入m条边  推断是否能构成有向欧拉通路了 有向图存在欧拉通路的充要条件: 1. 有向图的基图连通: 2. 全部点的出度和 ...

  5. POJ 1300 欧拉通路&欧拉回路

    系统的学习一遍图论!从这篇博客开始! 先介绍一些概念. 无向图: G为连通的无向图,称经过G的每条边一次并且仅一次的路径为欧拉通路. 如果欧拉通路是回路(起点和终点相同),则称此回路为欧拉回路. 具有 ...

  6. poj 2513 连接火柴 字典树+欧拉通路 好题

    Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 27134   Accepted: 7186 ...

  7. poj2513- Colored Sticks 字典树+欧拉通路判断

    题目链接:http://poj.org/problem?id=2513 思路很容易想到就是判断欧拉通路 预处理时用字典树将每个单词和数字对应即可 刚开始在并查集处理的时候出错了 代码: #includ ...

  8. Colored Sticks POJ - 2513 并查集+欧拉通路+字典树hash

    题意:给出很多很多很多很多个棒子 左右各有颜色(给出的是单词) 相同颜色的可以接在一起,问是否存在一种 方法可以使得所以棒子连在一起 思路:就是一个判欧拉通路的题目,欧拉通路存在:没奇度顶点   或者 ...

  9. POJ2513Colored Sticks(欧拉通路)(字典树)(并查集)

                                                             Colored Sticks Time Limit: 5000MS   Memory ...

随机推荐

  1. [asp.net core]project.json(2)

    摘要 上篇文章介绍了project.json中的一部分属性.属性真的比较多,所以分开了,考虑到其中的英文比较简单,也不再进行翻译了,从英文原文中,直接粘贴过来了. project.json(1) pr ...

  2. wamp包--如何导出sql

    在windows下安装wamp,如果不想用phpmyadmin工具和其他工具,如何导出自己想要的sql呢. 比如:我想导出blogyaf库,可以从以下步骤进行操作. 1,进入到wamp的mysql安装 ...

  3. javascript 数据类型转换

    javascrīpt 类型转换函数 在Javascrīpt中,Double类型和Int类型都是看作为Number对象. 1.Number转成String number.toString() Strin ...

  4. 图解JavaScript 继承

    JavaScript作为一个面向对象语言,可以实现继承是必不可少的,但是由于本身并没有类的概念(不知道这样说是否严谨,但在js中一切都类皆是对象模拟)所以在JavaScript中的继承也区别于其他的面 ...

  5. wtforms 使用

    wtforms是一个表单模板库, 下面以修改密码表单为例简单说明其用法. 我们可以用python代码定义form的基本元素, 比如用户名/邮箱, 并给定各个元素的validation条件. 然后在re ...

  6. 深度剖析:如何实现一个 Virtual DOM 算法

    本文转载自:https://github.com/livoras/blog/issues/13 目录: 1 前言 2 对前端应用状态管理思考 3 Virtual DOM 算法 4 算法实现 4.1 步 ...

  7. 【CISP笔记】安全攻击与防护

    公开信息收集-搜索引擎 快速定位Google 搜索“5sf67.jsp”可以找到存在此脚本的Web网站Google 搜索“teweb/default.htm”就可找到开放着远程Web连接的服务器信息挖 ...

  8. JVM内存模型和关键参数设置

    一. JVM内存模型: Jvm内存模型是学好Java很重要的一部分,该部分学习能让我们在系统运维的时候,或者优化服务器的时候能够有方法,懂原理. 二. Jvm关键参数: 1. 堆大小设置参数: -Xm ...

  9. Linux下6种优秀的邮件传输代理

    导读 在互联网上,邮件客户端向邮件服务器发送邮件然后将消息路由到正确的目的地(其他客户),其中邮件服务器使用的一个网络应用程序称为邮件传输代理(MTA). 最好的Linux邮件传输代理(MTAs) 邮 ...

  10. iOS 图片 的 聊天气泡显示 Objective-C

    - (void)viewDidLoad { [super viewDidLoad]; UIImageView *ImageView01 = [[UIImageView alloc] init]; [I ...