题意:给你n个字符串,每个字符串可以和另一个字符串连接的前提是,前一个字符串的尾字符等于后一个字符串的首字符,问你存不存在欧拉通路并输出

解题思路:基本标准流程,建图:把一个字符串可以看作一条首字符指向尾字符的一条边,因为这道题需要输出字典序最小的,那么得先给他排序,按照字典序从小到大排,因为我用前向星存图,所以首字符相同的,按尾字符从大到小排

建完图后查看是否存在欧拉路径,如果存在,就输出,输出用dfs回溯的方法输出的;

代码:

#include<iostream>
#include<algorithm>
#include<stack>
#include<cstring>
#include<string>
using namespace std;
const int maxn=5005;
struct Edge
{
int next;
int to;
int num;
int flag;
}edge[maxn];
int head[maxn];
int cnt,n,m,x,y,start;
int visit[30],f[30],ing[30],oug[30];
string s[1050];
stack<int>q;
int findfa(int u)
{
if(u==f[u])
return u;
else
{
f[u]=findfa(f[u]);
return f[u];
}
}
void join(int u,int v)
{
int t1=findfa(u);
int t2=findfa(v);
if(t2!=t1)
f[t2]=t1;
}
bool cmp(const string a, const string b)
{
if(a[0]==b[0])return a>b;
return a<b;
}
void add(int u,int v,int i)
{
edge[cnt].next=head[u];edge[cnt].to=v;
edge[cnt].flag=0;edge[cnt].num=i;head[u]=cnt++;
}
void dfs(int u)
{
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(edge[i].flag==0)
{
edge[i].flag=1;
dfs(v);
q.push(edge[i].num);
}
}
}
int check()
{
int num=0;
for(int i=1;i<=26;i++)
{
if(visit[i]==1&&findfa(i)==i)
num++;
if(num>=2)
return -1;
}
int cnt1=0,cnt2=0;
for(int i=1;i<=26;i++)
{
if(visit[i]==0)
continue;
if(ing[i]==oug[i])
continue;
if(ing[i]==oug[i]+1)
{
cnt1++;continue;
}
if(ing[i]==oug[i]-1)
{
start=i;cnt2++;continue;
}
return -1;
}
if(cnt1==cnt2&&cnt1==0)
return 1;
if(cnt1==cnt2&&cnt1==1)
return 2;
return -1;
}
void init()
{
memset(visit,0,sizeof(visit));
memset(ing,0,sizeof(ing));
memset(oug,0,sizeof(oug));
memset(head,-1,sizeof(head));
cnt=0;
for(int i=1;i<=30;i++)
f[i]=i;
}
int main()
{
int tt;
cin>>tt;
while(tt--)
{
init();
cin>>n;
for(int i=1;i<=n;i++)
cin>>s[i];
sort(s+1,s+1+n,cmp);
for(int i=1;i<=n;i++)
{
m=s[i].size();
x=s[i][0]-'a'+1;y=s[i][m-1]-'a'+1;
add(x,y,i);join(x,y);oug[x]++;ing[y]++;visit[x]=1;visit[y]=1;
}
int xx=check();
if(xx==-1)
cout<<"***\n";
else if(xx==1)
{
dfs(s[1][0]-'a'+1);
int mm=q.size();int cot=0;
while(!q.empty())
{
cot++;
cout<<s[q.top()];q.pop();
if(cot<mm)
cout<<".";
}
cout<<endl;
}
else if(xx==2)
{
dfs(start);
int mm=q.size();int cot=0;
while(!q.empty())
{
cot++;
cout<<s[q.top()];q.pop();
if(cot<mm)
cout<<".";
}
cout<<endl;
}
}
}

  

poj-2337(欧拉回路输出)的更多相关文章

  1. poj 2337 欧拉回路输出最小字典序路径 ***

    把26个小写字母当成点,每个单词就是一条边. 然后就是求欧拉路径. #include<cstdio> #include<iostream> #include<algori ...

  2. poj 1041(欧拉回路+输出字典序最小路径)

    题目链接:http://poj.org/problem?id=1041 思路:懒得写了,直接copy吧:对于一个图可以从一个顶点沿着边走下去,每个边只走一次,所有的边都经过后回到原点的路.一个无向图存 ...

  3. POJ 2337 欧拉回路

    题意: 如果给出的单词能够首尾相接,请按字典序输出单词,中间要加'.' 否则输出三个"*". 思路: 欧拉回路 记得按字典序排序哦~ 加边的时候要倒着加.(邻接表遍历的时候是反着的 ...

  4. poj 2337 有向图输出欧拉路径

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10186   Accepted: 2650 Descrip ...

  5. POJ 2337 Catenyms(欧拉回(通)路:路径输出+最小字典序)

    题目链接:http://poj.org/problem?id=2337 题目大意:给你n个字符串,只有字符串首和尾相同才能连接起来.请你以最小字典序输出连接好的单词. 解题思路:跟POJ1386一个意 ...

  6. poj 2337 && zoj 1919 欧拉回路+连通性判断

    题目要求按字典序排列,而且可能有重边 所以一开始就将数组从大到小排列,那么我将字符串加入链表时就会令小的不断前移,大的被挤到后面 这里有一点问题就是我一开始使用的是qsort: int cmp(con ...

  7. POJ 2337 输出欧拉路径

    太无语了. 这道题做了一整天. 主要还是我太弱了. 以后这个就当输出欧拉路径的模版吧. 题目中的输出字典序最小我有点搞不清楚,看了别人是这么写的.但是我发现我过不了后面DISCUSS里面的数据. 题意 ...

  8. Catenyms POJ - 2337(单词+字典序输出路径)

    题意: 就是给出几个单词 看能否组成欧拉回路或路径  当然还是让输出组成的最小字典序的路 解析: 还是把首尾字母看成点   把单词看成边 记录边就好了 这题让我对fleury输出最小字典序又加深了一些 ...

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

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

  10. POJ 2337 Catenyms (欧拉回路)

    Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8173   Accepted: 2149 Descript ...

随机推荐

  1. router-link 绑定事件的方式

    实现方法如下  使用.native 实现原生事件 <router-link to="" @click.native="dialogWithdraw=true&quo ...

  2. iOS开发简记(6):storyboard的使用

    从xib到storyboard,iOS界面开发的方式在变化. 这里记录怎么使用storyboard来完成简单的界面开发,比如实现一个“我”的简单界面. (1)新建storyboard 在新建文件向导中 ...

  3. ESP8266的低功耗方案-睡眠模式

    在某些时候我们设计的产品可能不具备持久供电的环境,那通常会采用锂电池.干电池一类的轻便型的非持久性电源.当遇到这种情况时,产品的续航能力可能就会成用户评估产品的一个重要指标,加大电池容量当然是最为直接 ...

  4. 人生就像一条加速奔向死亡的贪吃蛇【winform版】

    群里聊天的时候,一个学妹说她在做贪吃蛇的小作业,于是昨晚(5.20无聊只好撸代码/(ㄒoㄒ)/~~)花了2个小时撸了一个出来,早上又花了些时间完善功能,就有了这个还算比较完善的版本,当然代码结构比较混 ...

  5. OO生存指南P1

    写在OO作业之前 在正式写oo作业之前,先说一些“废话”吧,就当是对oo的吐槽. 事实上,早在大一的时候,听说数分很难,然而事实证明数分并没有有让我通宵的体验. 在大二上的时候有一门课叫祭祖,号称是第 ...

  6. 小程序wxRequest封装

    //const host = 'http://114.215.00.00:8005';// 测试地址 const host = 'https://xx.xxxxxxxx.net'; // 正式地址 c ...

  7. sql定时备份

    老规矩,直接上代码: ) set @name='C:\Backup\MyStudy_'+ ),)+'.bak' BACKUP DATABASE[MyStudy]TO DISK=@name WITH N ...

  8. 区块链教程(二):比特币、区块链、以太坊、Hyperledger的关系

    不知道大家喜不喜欢音乐! 朋克音乐:诞生于七十年代中期,一种源于六十年代车库摇滚和前朋克摇滚的简单摇滚乐.它由一个简单悦耳的主旋律和三个和弦组成,经过演变,朋克已经逐渐脱离摇滚,成为一种独立的音乐,朋 ...

  9. Velocity中为什么要使用{}来明确标识变量

    原因 比如在页面中,页面中有一个$someonename,此时,Velocity将把someonename作为变量名,若我们程序是想在someone这 个变量的后面紧接着显示name字符,则上面的标签 ...

  10. Laravel Providers——服务提供者的注册与启动源码解析

      本文 GitBook 地址: https://www.gitbook.com/book/leoyang90/laravel-source-analysishttps://learnku.com/a ...