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 ...
随机推荐
- [Leetcode][JAVA] Interleaving String
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ...
- Android 断点续传 思路
大部分http服务器本身是可以支持range字段和断点续传的.另外 http返回206字段表示支持断点续传. 但是遇到支持的服务器的时候,就需要手动去处理断点续传的功能. 客户端在请求文件的时候添加 ...
- 一个用shell写的统计目录下统计文件行数的代码
此代码是用来回忆当初学的shell脚本,很多知识忘了,写这个花了我三个小时的时间 #!/bin/ksh #count *.c file the num of lineg_csum=0g_hsum=0 ...
- PyQt4学习资料汇总
一个月前研究了下PyQt4,感觉比较不错.相比wxpython,界面美观了很多,并且将界面设计与代码逻辑很好的分离了开来.关于PyQt4的资料也不少,这里我将我找到的资料汇总一下,以防自己以后忘得一干 ...
- MyEclipse使用技巧
1. 大小写切换: Ctrl + Shift + X 大写: Ctrl + Shift + Y 小写: 2. 自动导包: Ctrl + Shift + O 3. 运行前自动保存 ...
- Service简介
Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过<service>来声明.可以通过contect.startservice ...
- 使用XmlDataDocument将数据存储到XML文档
string str = "Data Source=192.168.1.20;Initial Catalog=WebTest;User ID=sa;Password="; SqlC ...
- 集合的扩展方法ForEach的使用
List<, , , , }; list.ForEach(p => Console.WriteLine(p)); 或者 List<, , , , }; list.ForEach(p ...
- MQTT V3.1----flow
该文章转自:聂永的博客(http://www.blogjava.net/yongboy/archive/2014/02/15/409893.html) 网络故障 在任何网络环境下,都会出现一方连接失败 ...
- Sensor(LIGHT)
package com.example.sensor01; import java.util.List; import android.hardware.Sensor; import android. ...