POJ 2337 Catenyms(欧拉回(通)路:路径输出+最小字典序)
题目链接:http://poj.org/problem?id=2337
题目大意:给你n个字符串,只有字符串首和尾相同才能连接起来。请你以最小字典序输出连接好的单词。
解题思路:跟POJ1386一个意思,就是把26个字母当成点,单词当做有向边,判断欧拉回(通)路。但是要输出路径也就是单词,而且要求字典序最小。
可以通过将单词先排序再添加边使字典序最小,还有注意起点,如果有一个出度比入度大1的点,就从这个点出发,否则从最小的点出发。
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int M=2e4+;
const int N=1e4+; struct node{
int to,next;
string w;
}edge[M]; int idx;
int indeg[N],outdeg[N],head[N];
string str[M];
bool vis[M];
stack<string>sk; void init(){
idx=;
CLR(head,);
CLR(indeg,);
CLR(outdeg,);
CLR(vis,false);
while(!sk.empty()){
sk.pop();
}
} void addedge(int u,int v,string w){
edge[idx].to=v;
edge[idx].w=w;
edge[idx].next=head[u];
head[u]=idx++;
} void dfs(int u){
for(int &j=head[u];j;j=edge[j].next){
node t=edge[j];
if(!vis[j]){
vis[j]=true;
dfs(t.to);
sk.push(t.w);
}
}
} int main(){
FAST_IO;
int t;
cin>>t;
while(t--){
init();
int n;
cin>>n;
for(int i=;i<n;i++)
cin>>str[i];
sort(str,str+n);
int start=;
//字典序大的先加入,因为静态邻接表是反向添加的
for(int i=n-;i>=;i--){
int u,v;
u=str[i][]-'a';
v=str[i][str[i].length()-]-'a';
outdeg[u]++;
indeg[v]++;
addedge(u,v,str[i]);
start=min(start,min(u,v));
}
int chu=,ru=;
bool flag=true;
for(int i=;i<;i++){
if(indeg[i]+outdeg[i]==)
continue;
if(indeg[i]!=outdeg[i]){
if(indeg[i]+==outdeg[i]){
chu++;
start=i; //如果有一个出度比入度大1的点,就从这个点出发,否则从最小的点出发
}
else if(indeg[i]-==outdeg[i])
ru++;
else
flag=false;
}
}
if(flag&&(chu==&&ru==||chu==&&ru==)){
dfs(start);
if(sk.size()==n){
while(!sk.empty()){
if(sk.size()==)
cout<<sk.top()<<endl;
else
cout<<sk.top()<<".";
sk.pop();
}
}
else
puts("***");
}
else
puts("***");
}
return ;
}
POJ 2337 Catenyms(欧拉回(通)路:路径输出+最小字典序)的更多相关文章
- poj 2337(单向欧拉路的判断以及输出)
Catenyms Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11648 Accepted: 3036 Descrip ...
- POJ 2337 Catenyms(有向图的欧拉通路)
题意:给n个字符串(3<=n<=1000),当字符串str[i]的尾字符与str[j]的首字符一样时,可用dot连接.判断用所有字符串一次且仅一次,连接成一串.若可以,输出答案的最小字典序 ...
- POJ 2337 Catenyms (欧拉回路)
Catenyms Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8173 Accepted: 2149 Descript ...
- POJ 2253 Frogger【最短路变形——路径上最小的最大权】
链接: http://poj.org/problem?id=2253 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
- Pots(POJ - 3414)【BFS 寻找最短路+路径输出】
Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...
- Poj 2337 Catenyms(有向图DFS求欧拉通路)
题意: 给定n个单词, 问是否存在一条欧拉通路(如acm,matal,lack), 如果存在, 输出字典序最小的一条. 分析: 这题可以看作http://www.cnblogs.com/Jadon97 ...
- POJ 2337 Catenyms
http://poj.org/problem?id=2337 题意: 判断给出的单词能否首尾相连,输出字典序最小的欧拉路径. 思路: 因为要按字典序大小输出路径,所以先将字符串排序,这样加边的时候就会 ...
- POJ 2337 Catenyms (欧拉图)
本文链接http://i.cnblogs.com/EditPosts.aspx?postid=5402042 题意: 给你N个单词,让你把这些单词排成一个序列,使得每个单词的第一个字母和上一个字单词的 ...
- POJ 2337 Catenyms(有向欧拉图:输出欧拉路径)
题目链接>>>>>> 题目大意: 给出一些字符串,问能否将这些字符串 按照 词语接龙,首尾相接 的规则 使得每个字符串出现一次 如果可以 按字典序输出这个字符串 ...
随机推荐
- 【BZOJ4405】【WC2016】挑战NPC(带花树)
[BZOJ4405][WC2016]挑战NPC(带花树) 题面 BZOJ 洛谷 Uoj Description 小N最近在研究NP完全问题,小O看小N研究得热火朝天,便给他出了一道这样的题目: 有n个 ...
- 【BZOJ3504】危桥(网络流)
[BZOJ3504]危桥(网络流) 题面 BZOJ 洛谷 Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的, ...
- 洛谷 P2053 [SCOI2007]修车 解题报告
P2053 [SCOI2007]修车 题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术 ...
- ping: unknown host 解决办法
如果ping命令返回如下错误,那主要的可能性就是系统的DNS设置有误. [root@CentOS5 ~]# ping www.sina.com.cn ping: unknown host www.si ...
- [Wf2011]Chips Challenge
两个条件都不太好处理 每行放置的个数实际很小,枚举最多放x 但还是不好放 考虑所有位置先都放上,然后删除最少使得合法 为了凑所有的位置都考虑到,把它当最大流 但是删除最少,所以最小费用 行列相关,左行 ...
- ORACLE 中如何截取到时间的年月日中的年、月、日
在Oracle中,要获得日期中的年份,例如把sysdate中的年份取出来,并不是一件难事.常用的方法是:Select to_number(to_char(sysdate,'yyyy')) from d ...
- ML博客链接
http://blog.csdn.net/yingwei13mei/article/category/6602238 各种都有(系统教程):http://www.easemob.com/news/76 ...
- NYOJ--69
数的长度 原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=69 分析:先看看求n!的朴素算法,用大整数乘法来实现. #include< ...
- 省选模拟赛 LYK loves graph(graph)
题目描述 LYK喜欢花花绿绿的图片,有一天它得到了一张彩色图片,这张图片可以看做是一张n*m的网格图,每个格子都有一种颜色去染着,我们用-1至n*m-1来表示一个格子的颜色.特别地,-1代表这个颜色是 ...
- 【mysql】测试方案整理
http://www.cnblogs.com/callhe/ https://www.digitalocean.com/community/tutorials/how-to-measure-mysql ...