NYOJ 99单词拼接(有向图的欧拉(回)路)
/*
NYOJ 99单词拼接:
思路:欧拉回路或者欧拉路的搜索!
注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE!
有向图的欧拉路:abs(In[i] - Out[i])==1(入度[i] - 出度[i])的节点个数为两个
有向图的欧拉回路:所有的节点都有In[i]==Out[i]
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; struct node{
char s[];
int first, end;
}; bool cmp(node a, node b){
return strcmp(a.s, b.s) <;
} node nd[];
int In[], Out[];
int order[], vis[];
int n; int fun(){
memset(vis, , sizeof(vis));
int i;
int last=-;
int first=-;
//有向图欧拉路的判断
for(i=; i<; ++i)
{
if(In[i]!=Out[i])
{ //首先入度和出度之差的绝对值为 1的节点的要么没有,要么只有两个(没有欧拉回路,只有欧拉路)!
if(Out[i]-In[i]== && first==-)
first=i;
else if(Out[i]-In[i]==- && last==-)
last=i;
else
return -;
}
}
if(first>- && last>-) //这种情况是 欧拉路的搜索 !
return first;
else if(first==- && last==-) //这种是欧拉回路的搜索!
{
for(i=; i<; ++i)
if(In[i]!=)
return i;
}
else
return -;
} bool dfs(int st, int cnt){
if(cnt == n)
return true;
int ld=, rd=n-;
while(ld<=rd){
int mid=(ld+rd)/;
if(nd[mid].first<st)
ld=mid+;
else rd=mid-;
}
int m=rd+;
if(nd[m].first > st) return false;
for(int i=m; i<n; ++i)
if(!vis[i]){
if(nd[i].first > st)
return false;
if(nd[i].first == st){
vis[i]=;
order[cnt]=i;
if(dfs(nd[i].end, cnt+)) return true;
vis[i]=;
}
}
return false;
} int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
memset(In, , sizeof(In));
memset(Out, , sizeof(Out));
for(int i=; i<n; ++i){
scanf("%s", nd[i].s);
nd[i].first=nd[i].s[]-'a';
nd[i].end=nd[i].s[strlen(nd[i].s)-]-'a';
++Out[nd[i].first];
++In[nd[i].end];
} int st = fun();
//因为搜索的是字典序的第一个,所以将字符串从小到大排一下序!在搜索的时候按照升序搜索组合!
sort(nd, nd+n, cmp);
if(st==- || !dfs(st, ))
printf("***\n");
else{
printf("%s", nd[order[]].s);
for(int i=; i<n; ++i)
printf(".%s", nd[order[i]].s);
printf("\n");
}
}
return ;
}
NYOJ 99单词拼接(有向图的欧拉(回)路)的更多相关文章
- nyoj 99 单词拼接
点击打开链接 单词拼接 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同 ...
- CF36 E Two Paths——欧拉(回)路
题目:http://codeforces.com/contest/36/problem/E 给定一张无向图,要求输出两条欧拉路覆盖所有边: 分类讨论,首先判-1:有两个以上连通块 / 有四个以上奇度数 ...
- POJ 2337 Catenyms(有向图的欧拉通路)
题意:给n个字符串(3<=n<=1000),当字符串str[i]的尾字符与str[j]的首字符一样时,可用dot连接.判断用所有字符串一次且仅一次,连接成一串.若可以,输出答案的最小字典序 ...
- NYIST 99 单词拼接
单词拼接时间限制:3000 ms | 内存限制:65535 KB难度:5 描述给你一些单词,请你判断能否把它们首尾串起来串成一串.前一个单词的结尾应该与下一个单词的道字母相同.如 aloha dog ...
- POJ 1780 Code(有向图的欧拉通路)
输入n(1<=n<=6),输出长度为10^n + n -1 的字符串答案. 其中,字符串以每n个为一组,使得所有组都互不相同,且输出的字符串要求字典序最小. 显然a[01...(n-1)] ...
- Poj 2337 Catenyms(有向图DFS求欧拉通路)
题意: 给定n个单词, 问是否存在一条欧拉通路(如acm,matal,lack), 如果存在, 输出字典序最小的一条. 分析: 这题可以看作http://www.cnblogs.com/Jadon97 ...
- HDU1116 Play on Words(有向图欧拉通路)
我把单词当作点,然后这样其实是不对的,这样就要判定是否是哈密顿通路.. 这题应该把单词的首尾单词当作点,而单词本身就是边,那样就是判定欧拉通路了. 有向图包含欧拉通路的充要条件是:首先基图连通,然后是 ...
- Uva 10129 - Play on Words 单词接龙 欧拉道路应用
跟Uva 10054很像,不过这题的单词是不能反向的,所以是有向图,判断欧拉道路. 关于欧拉道路(from Titanium大神): 判断有向图是否有欧拉路 1.判断有向图的基图(即有向图转化为无向图 ...
- GCD nyoj 1007 (欧拉函数+欧几里得)
GCD nyoj 1007 (欧拉函数+欧几里得) GCD 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 The greatest common divisor ...
随机推荐
- log4j写入数据库
转发自http://www.cnblogs.com/adolfmc/p/3432720.html Log4j 配置数据库连接池(将日志信息保存到数据库) org.apache.log4j.jdbc.J ...
- oracle表空间不足时的处理方法
由于数据文件路径下的空间不足或表空间不足时,需要更换或扩展或新增表空间时,以下简单介绍下几种处理方式(数据文件/opt/oracle/oradata/testdb.dbf,原大小为100M) 一.扩大 ...
- ajax500错误
昨天做一个需求,原先使用form提交的东西,领导说要改成使用ajax提交.嗯,听起来好像很简单很简单哦,可惜我已经很少敲代码了.擦,这工作让人槽点无数.果断写代码. var fm=document.g ...
- segmentControl实现控制器的切换
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...
- MVC_Controller
准备工作 安装VS2010或更高版本 安装数据库2008或更高版本 视个人系统不同配置IIS本地服务 数据库和VS下载地址 http://msdn.itellyou.cn/ 本节目标 通过本节案例对M ...
- 【转载】关于.NET里的内存泄漏
所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中..Net 中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象编程了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉.虽然.N ...
- 创建动态WCF服务(无配置文件)
public class WCFServer { ServiceHost host = null; public WCFServer(string addressurl, string tcpurl, ...
- [.NET领域驱动设计实战系列]专题十一:.NET 领域驱动设计实战系列总结
一.引用 其实在去年本人已经看过很多关于领域驱动设计的书籍了,包括Microsoft .NET企业级应用框架设计.领域驱动设计C# 2008实现.领域驱动设计:软件核心复杂性应对之道.实现领域驱动设计 ...
- 使用Struts 拦截namespace进行权限控制
有时候我需要在几个包下都需要进行同一个权限控制.如在购物网站中,我们需要进入个人中心.下订单.评价商品等等都需要进行登录权限控制,但是这几个模块并不是位于同一个package下.Struts提供的拦截 ...
- Windows上帝模式,上帝应该就是这样使用Windows的
Windows上帝模式(Windows Master Control Panel)由来已久,最早是从Win7优化大湿里看到的一个选项,开启后在桌面生成一个图标,点进去后里面包含了几乎全部Windows ...