题目链接>>>>>>

题目大意:

给出一些字符串,问能否将这些字符串  按照 词语接龙,首尾相接  的规则 使得每个字符串出现一次

如果可以 按字典序输出这个字符串序列

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#define M 1050
using namespace std;
int n, top;
struct edge {
int to, vis, id; //to代表边的终点,id代表边的编号
};
vector<edge>w[M];
string str[M]; //原来还可以这样定义字符串数组
int ans[M];
int fa[]; int find(int x)
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
} void fleury(int loc)
{
for (int i = ; i<w[loc].size(); i++)
if (!w[loc][i].vis)
{
w[loc][i].vis = ;
fleury(w[loc][i].to);
ans[top++] = w[loc][i].id;
}
return;
} int main()
{
int indegree[], outdegree[];
int T;
scanf("%d", &T);
while (T--)
{
top = ;
for (int i = ; i<; i++)
{
w[i].clear();
outdegree[i] = indegree[i] = ;
fa[i] = i;
}
scanf("%d", &n);
int a, b;
for (int i = ; i<n; i++)
cin >> str[i];
sort(str, str + n); //根据字典序排序
edge edg;
int start;
for (int i = ; i<n; i++)
{
a = str[i][] - 'a';
b = str[i][str[i].size() - ] - 'a';
indegree[a]++;
outdegree[b]++;
fa[find(a)] = find(b);
edg.to = b; edg.vis = ; edg.id = i;
w[a].push_back(edg);
if (i == ) //重要 起点必须为初始化为第一条边的出节点(字典序最小,且满足 欧拉回路 的的要求)
start = a;
} int ss = , num = , start_num = , end_num = ;
for (int i = ; i<; i++)
{
if ((indegree[i] || outdegree[i]) && find(i) == i) //find(i)==i是用来判断整个图是否连通的,因为图存在欧拉通路的条件之一就是必须是连通图
ss++; //结合下面的ss==1,来理解,因为如果整个图是连通的,ss就只会在当i为根节点的时候+1
if (indegree[i] != outdegree[i])
{
if (outdegree[i] - indegree[i] == -)
start = i, start_num++; //这里和上面的初始化start的步骤不懂,做题的时候就是卡在了选取第一个出节点的步骤
else if (outdegree[i] - indegree[i] == )
end_num++;
num++;
}
}
if ((num == || (num == && start_num == && end_num == )) && ss == ) //存在欧拉通路的条件
{
fleury(start); //我对start的选取不是很理解
for (int i = top - ; i >= ; i--) //要使输出的单词按字典序输出
{
if (i == )
cout << str[ans[i]] << endl;
else
cout << str[ans[i]] << ".";
}
}
else
cout << "***" << endl;
}
return ;
}

2018-04-07

POJ 2337 Catenyms(有向欧拉图:输出欧拉路径)的更多相关文章

  1. POJ 2337 Catenyms (有向图欧拉路径,求字典序最小的解)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8756   Accepted: 2306 Descript ...

  2. POJ 2337 Catenyms(欧拉回(通)路:路径输出+最小字典序)

    题目链接:http://poj.org/problem?id=2337 题目大意:给你n个字符串,只有字符串首和尾相同才能连接起来.请你以最小字典序输出连接好的单词. 解题思路:跟POJ1386一个意 ...

  3. poj 2337 Catenyms 【欧拉路径】

    题目链接:http://poj.org/problem?id=2337 题意:给定一些单词,假设一个单词的尾字母与还有一个的首字母同样则能够连接.问能否够每一个单词用一次,将全部单词连接,能够则输出字 ...

  4. POJ 2337 Catenyms (欧拉图)

    本文链接http://i.cnblogs.com/EditPosts.aspx?postid=5402042 题意: 给你N个单词,让你把这些单词排成一个序列,使得每个单词的第一个字母和上一个字单词的 ...

  5. POJ 2337 Catenyms

    http://poj.org/problem?id=2337 题意: 判断给出的单词能否首尾相连,输出字典序最小的欧拉路径. 思路: 因为要按字典序大小输出路径,所以先将字符串排序,这样加边的时候就会 ...

  6. POJ 2337 Catenyms (欧拉回路)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8173   Accepted: 2149 Descript ...

  7. POJ 2337 Catenyms(有向图的欧拉通路)

    题意:给n个字符串(3<=n<=1000),当字符串str[i]的尾字符与str[j]的首字符一样时,可用dot连接.判断用所有字符串一次且仅一次,连接成一串.若可以,输出答案的最小字典序 ...

  8. Poj 2337 Catenyms(有向图DFS求欧拉通路)

    题意: 给定n个单词, 问是否存在一条欧拉通路(如acm,matal,lack), 如果存在, 输出字典序最小的一条. 分析: 这题可以看作http://www.cnblogs.com/Jadon97 ...

  9. poj 2337 有向图输出欧拉路径

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10186   Accepted: 2650 Descrip ...

随机推荐

  1. jquery开发自定义的插件总结

    1.第一种方式,有元素的插件 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...

  2. Protobuf使用手册

    Protobuf使用手册 第1章 定义.proto 文件 首先我们需要编写一个 proto 文件,定义我们程序中需要处理的结构化数据,在 protobuf 的术语中,结构化数据被称为 Message. ...

  3. V4L2文档翻译(一)【转】

    转自:https://blog.csdn.net/airk000/article/details/23218903 相关资料 https://www.kernel.org/doc/Documentat ...

  4. nodejs 数据库操作,消息的发送和接收,模拟同步

    var deasync = require('deasync'); //导入模板 var mysql=require('mysql'); var Stomp = require('stompjs'); ...

  5. asp.net动态解析用户控件(UserControl)

    模块化的时候需要用到: #region asp.net解析用户控件 /// <summary> /// asp.net 解析用户控件 /// </summary> /// &l ...

  6. (常用)re模块

    re模块(正则)#re:一些带有特殊含义的符号或者符号的组合#为什么要用re:一堆字符串中找到你所需要的内容,过滤规则是什么样,通过re模块功能来告诉计算机你的过滤规则#应用:在爬虫中最为常用:使用爬 ...

  7. Spark学习之概念了解

    Spark简介: Spark是一个快速且通用的集群计算模型: 1.Spark是快速的:快速是指处理几T到几批数据量的时候,他的处理时间是几秒钟或几分钟,相对于hadoop的几分钟到几小时是非常快速的, ...

  8. Day6------------复习

    文件归档:tar cvf test.tar 文件压缩:gzip 目标文件 bzip2 test,tar 文件解压:gunzip test.tar.gz bzip2 test.tar.bz2 文件打包压 ...

  9. 用jquery添加新元素很容易,面对jquery append 动态添加的元素事件on 不起作用我们该如何解决呢?

    用jquery添加新元素很容易,面对jquery append 动态添加的元素事件on 不起作用我们该如何解决呢?on方法中要先找到原选择器(如例.info),再找到动态添加的选择器(如列.delet ...

  10. exe4j中"this executable was created with an evaluation version exe4j"的解决

    在使用exe4j时,如果您的exe4j没有注册,在运行有exe4j转换的*.jar为*.exe的可执行文件时,会提示:"this executable was created with an ...