题意:

给定n个单词, 问是否存在一条欧拉通路(如acm,matal,lack), 如果存在, 输出字典序最小的一条。

分析:

这题可以看作http://www.cnblogs.com/Jadon97/p/7210278.html升级版本(那题只问是否存在, 这题需要输出路径)

判断有向图的欧拉通路, 主要用到出入度的判定和连通性。

有向图欧拉通路判定方法:图连通;除2个端点外其余节点入度=出度;1个端点入度比出度大1;一个端点入度比出度小1 或 所有节点入度等于出度

DFS求解算法:选择一个正确的起点,用DFS算法遍历所有的边(每条边只遍历一次),遇到走不通就回退。在搜索前进方向上将遍历过的边按顺序记录下来,这组边的排列就组成了一条欧拉通路或者回

#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
string word[];
struct node
{
int to, index;
node(int _to, int _index): to(_to), index(_index) {};
};
vector<node> G[];
int degree[], vis[], used[], ans[];
int n, tot;
int st;
int id(int a)
{
return a - 'a';
}
void dfs(int u)
{
// cout << word[index] << "\n";
for(int i = ; i < G[u].size(); i++)
{
int v = G[u][i].to, index = G[u][i].index;
if(!vis[index])
{
vis[index] = ;
dfs(v);
ans[tot++] = index;
}
}
}
bool judge()
{
int cc1 = , cc2 = ; //cc1 出度>入度 cc2 入度>出度
for(int i = ; i < ; i++)
{
if(used[i])
{
if(degree[i] != )
{
if(degree[i] == )
{
cc1++, st = i;//如果出度大于入度, 那么以该点为起点
}
else if(degree[i] == -)
{
cc2++;
}
else
{
return false;
}
}
}
}
if((cc1 || cc2) && cc1 + cc2 != ) //有出度入度不等的点, 而且不止2个
{
return false;
}
return true;
}
int main()
{
// freopen("1.txt","r", stdin);
int T;
cin >> T;
while(T--)
{
for(int i = ; i < ; i++)
G[i].clear();
memset(used, , sizeof(used));
memset(vis, , sizeof(vis));
memset(degree, , sizeof(degree));
tot = ; cin >> n;
for(int i = ; i < n; i++)
{
cin >> word[i];
} sort(word, word + n);
st = ;
for(int i = ; i < n; i++)
{
int u = id(word[i][]), v = id(word[i][word[i].size()-]);
G[u].push_back(node(v,i));
if(u < st)
st = u; //从字典序最小的开始遍历
used[u] = used[v] = ; //记录u,v是用过的
degree[u]++, degree[v]--; //出度++, 入度--
} if(!judge())
{
printf("***\n");
continue;
}
dfs(st);
if(tot != n) //不连通
{
printf("***\n");
continue;
} else
{
cout << word[ans[tot-]];
for(int i = tot - ; i >= ; i--)//反向输出路径
{
cout <<"." << word[ans[i]] ;
}
puts("");
}
}
}

Poj 2337 Catenyms(有向图DFS求欧拉通路)的更多相关文章

  1. ACM/ICPC 之 DFS求解欧拉通路路径(POJ2337)

    判断是欧拉通路后,DFS简单剪枝求解字典序最小的欧拉通路路径 //Time:16Ms Memory:228K #include<iostream> #include<cstring& ...

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

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

  3. POJ 2337 Catenyms (欧拉图)

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

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

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

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

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

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

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

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

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

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

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

  9. POJ 2337 Catenyms(有向欧拉图:输出欧拉路径)

    题目链接>>>>>> 题目大意: 给出一些字符串,问能否将这些字符串  按照 词语接龙,首尾相接  的规则 使得每个字符串出现一次 如果可以 按字典序输出这个字符串 ...

随机推荐

  1. python中时间日期格式化符号的含义

    %y   两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-31) %H    24小时制小时数(0-23) %I   12 ...

  2. OLE/COM Object Viewer

    OLE/COM Object Viewer摘AutoIt Help The "OLE/COM Object Viewer" is a very handy tool to get ...

  3. Codeforces Round #544 (Div. 3) B.Preparation for International Women's Day

    链接:https://codeforces.com/contest/1133/problem/B 题意: 给n个数,和一个k,在n个数中选几对数,保证没对数相加可以整除k. 求最大能选几个数. 思路: ...

  4. 哈密顿图 BestCoder Round #53 (div.2) 1003 Rikka with Graph II

    题目传送门 题意:判断是否为哈密顿图 分析:首先一种情况是不合法的:也就是度数为1的点超过2个:合法的有:,那么从度数为1的点开始深搜,如果存在一种走法能够走完n个点那么存在哈密顿路 收获:学习资料 ...

  5. 7.2 Collection和Iterator接口

  6. HttpURLConnection 发送PUT请求 json请求体 与服务端接收

    发送请求: public void testHttp() { String result = ""; try { URL postURL = new URL("http: ...

  7. Split方法,拆分字符串后,去除返回的空值

         我们在使用Split('')方法的时候,根据指定的 '字符' 对字符串进行拆分,当'字符’为最后一个,将会拆分一个空值进行返回. 这个时候我们可以使用 string.Split(new ch ...

  8. mysql单向自动同步

    mysql自动同步 以下教程均使用mysql自带的自动同步功能 全库单向自动同步 本例把192.168.3.45上名称为ewater_main的数据库自动同步到192.168.3.68的ewater_ ...

  9. 清理xcode缓存

    code版本:8.3.3 iOS版本:10.3.2 移除 Xcode 运行安装 APP 产生的缓存文件(DerivedData) 只要重新运行Xcode就一定会重新生成,而且会随着运行程序的增多,占用 ...

  10. ArrayList不同循环方式

    一: ArrayList<String> list = new ArrayList<String>();  list.add("1");  list.add ...