nyoj--99--单词拼接(欧垃图判定+输出)
单词拼接
- 描述
-
给你一些单词,请你判断能否把它们首尾串起来串成一串。
前一个单词的结尾应该与下一个单词的道字母相同。
如
aloha
dog
arachnid
gopher
tiger
rat
可以拼接成:aloha.arachnid.dog.gopher.rat.tiger
- 输入
- 第一行是一个整数N(0<N<20),表示测试数据的组数
每组测试数据的第一行是一个整数M,表示该组测试数据中有M(2<M<1000)个互不相同的单词,随后的M行,每行是一个长度不超过30的单词,单词全部由小写字母组成。 - 输出
- 如果存在拼接方案,请输出所有拼接方案中字典序最小的方案。(两个单词之间输出一个英文句号".")
如果不存在拼接方案,则输出
*** - 样例输入
-
2
6
aloha
arachnid
dog
gopher
rat
tiger
3
oak
maple
elm - 样例输出
-
aloha.arachnid.dog.gopher.rat.tiger
*** - 来源
- Waterloo local 2003.01.25 /POJ
-
上传者
这道题就是判断是否有欧拉路,然后输出欧垃迹,中间的数据处理有些麻烦,将单词掐头去尾,记录入度出度,因为最多用到26个字母,所以如果一个字母的入度和出度相差2或者更多,就不会有欧垃路,如果入度出度相差为一的字母数超过1,也不会有欧拉路,如果有,那麽就开始dfs,dfs找的时候从一个度数为奇数的点开始,知道全部找完,那么就输出欧垃迹,否则就是不存在
<pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
char s[30];
int f,l;
}word[1010];
int in[1010],out[1010],vis[1010],order[1010],m;
int f()
{
int x1,x2,ans=0;
x1=x2=0;
for(int i=0;i<26;i++)
{
if(abs(in[i]-out[i])>=2)
return -1;
else if(in[i]-out[i]==1)
x1++;
else if(in[i]-out[i]==-1)
{
x2++;
ans=i;
}
}
if(x1>1||x2>1)
return -1;
else if(x1==0)
{
for(int i=0;i<26;i++)
if(out[i])
return i;//因为我记录的出度是一个最后一个字母,所以从这儿开始dfs
}
else
return ans;
}
int cmp(node a,node b)
{
return strcmp(a.s,b.s)<0;
}
bool dfs(int st,int cnt)
{
if(cnt==m)
return 1;
for(int i=0;i<m;i++)
{
if(word[i].f<st||vis[i])
continue;
else if(word[i].f>st)
return false;
vis[i]=1;
order[cnt]=i;
if(dfs(word[i].l,cnt+1))
return 1;
vis[i]=0;
}
return false;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&m);
memset(vis,0,sizeof(vis));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(order,0,sizeof(order));
for(int i=0;i<m;i++)
{
scanf("%s",word[i].s);//单词掐头去尾,记录入度出度
int l=strlen(word[i].s);
word[i].f=word[i].s[0]-'a';
word[i].l=word[i].s[l-1]-'a';
in[word[i].l]++;
out[word[i].f]++;
}
int start=f();
if(start==-1)
{
printf("***\n");
continue;
}
sort(word,word+m,cmp);
if(!dfs(start,0))
{
printf("***\n");
continue;
}
printf("%s",word[order[0]].s);
for(int i=1;i<m;i++)
printf(".%s",word[order[i]].s);
printf("\n");
}
return 0;
}
nyoj--99--单词拼接(欧垃图判定+输出)的更多相关文章
- NYOJ 99单词拼接(有向图的欧拉(回)路)
/* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i ...
- nyoj 99 单词拼接
点击打开链接 单词拼接 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同 ...
- NYIST 99 单词拼接
单词拼接时间限制:3000 ms | 内存限制:65535 KB难度:5 描述给你一些单词,请你判断能否把它们首尾串起来串成一串.前一个单词的结尾应该与下一个单词的道字母相同.如 aloha dog ...
- POJ 1386 欧拉路的判定
题意: 给你n个单词,问你有没有一种排列方式可以所有单词的首部是相邻单词的尾部. 思路: 这个题目还挺基础的,就是个欧拉的判定,首先对于每一个单词,我们把他抽象成边,每个单词两 ...
- bzoj 1242: Zju1015 Fishing Net 弦图判定
1242: Zju1015 Fishing Net弦图判定 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 214 Solved: 81[Submit ...
- [bzoj1242] Zju1015 Fishing Net弦图判定
弦图判定..MCS算法. 先选一个点,然后每次拿 相邻已选点最多 的未选点. 选完之后判断一下是否是完美消除序列. #include<cstdio> #include<iostrea ...
- 单词拼接(dfs/回溯/递归)
单词拼接传送门 //单词拼接 #include<stdio.h> #include<string.h> #include<algorithm> using name ...
- 【Linux】利用Xvfb关闭chrome的图形化输出
利用Xvfb关闭chrome的图形化输出 #!/bin/bash . /home/fzuir/.profile # JAVA export JAVA_HOME=/usr/local/jdk1.7.0_ ...
- C# 图片流下载;图片流输出
图片流下载 string filePath = HttpContext.Current.Server.MapPath("/img/wxPic/"); if (!Directory. ...
随机推荐
- 数组、链表、栈、队列和STL
数组 数组是一种最基本的数据结构,它是内存上的一块连续存储空间.正因如此数组的随机访问很方便.但数组也有其固有的限制,大小分配后不能改变. STL中的数组 STL中的Array是静态数组模板,就是我们 ...
- BZOJ 4756 线段树合并(线段树)
思路: 1.最裸的线段树合并 2. 我们可以观察到子树求一个东西 那我们直接DFS序好了 入队的时候统计一下有多少比他大的 出的时候统计一下 减一下 搞定~ 线段树合并代码: //By SiriusR ...
- C# txt文件操作
//打开文件到流 FileStream fs=new FileStream(path,FileMode.Open,FileAccess.ReadWrite); //写文件流的方法 StreamWrit ...
- [OpenWrt]安装mjpg-streamer
安装mjpg-streamer 远程监控基本上是wifi小车的一个必备功能了.摄像头我用的是奥尼百脑通 D881,这个要100左右. 确认安装了以下软件: kmod-usb2 kmod-video-u ...
- WEB笔记-1、HTML 标记与文档结构
1.HTML 标记与文档结构 1.1 块级(block)和行内(inline)标签 块级标签 <h1>-<h6> : 6级标签,h1表示最重要(h1 不仅仅是最大最突出 ...
- Redhat/CentOS xfs文件系统及磁盘挂载
#!/bin/sh #DEVICE_LIST=""DEVICE_LIST="/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde /d ...
- boost的单例模式
template <typename T> struct singleton_default { private: struct object_creator { ...
- 运行于Windows内建账户下的服务访问映射网络驱动器的方法
Windows服务如果是运行在本地系统帐户下或本地服务帐户下,它只能访问这个账户自己创建的映射驱动器,UNC路径访问则不受次限制. LocalService Account (NT AUTHORITY ...
- UVa340未完成
#include<stdio.h> #define maxn 1010 int main() { ; while(scanf("%d",&num)!=EOF&a ...
- (转)基于MVC4+EasyUI的Web开发框架经验总结(5)--使用HTML编辑控件CKEditor和CKFinder
http://www.cnblogs.com/wuhuacong/p/3780356.html Web开发上有很多HTML的编辑控件,如CKEditor.kindeditor等等,很多都做的很好,本文 ...