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

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

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

代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<stack>
  4. #include<cstring>
  5. #include<string>
  6. using namespace std;
  7. const int maxn=5005;
  8. struct Edge
  9. {
  10. int next;
  11. int to;
  12. int num;
  13. int flag;
  14. }edge[maxn];
  15. int head[maxn];
  16. int cnt,n,m,x,y,start;
  17. int visit[30],f[30],ing[30],oug[30];
  18. string s[1050];
  19. stack<int>q;
  20. int findfa(int u)
  21. {
  22. if(u==f[u])
  23. return u;
  24. else
  25. {
  26. f[u]=findfa(f[u]);
  27. return f[u];
  28. }
  29. }
  30. void join(int u,int v)
  31. {
  32. int t1=findfa(u);
  33. int t2=findfa(v);
  34. if(t2!=t1)
  35. f[t2]=t1;
  36. }
  37. bool cmp(const string a, const string b)
  38. {
  39. if(a[0]==b[0])return a>b;
  40. return a<b;
  41. }
  42. void add(int u,int v,int i)
  43. {
  44. edge[cnt].next=head[u];edge[cnt].to=v;
  45. edge[cnt].flag=0;edge[cnt].num=i;head[u]=cnt++;
  46. }
  47. void dfs(int u)
  48. {
  49. for(int i=head[u];i!=-1;i=edge[i].next)
  50. {
  51. int v=edge[i].to;
  52. if(edge[i].flag==0)
  53. {
  54. edge[i].flag=1;
  55. dfs(v);
  56. q.push(edge[i].num);
  57. }
  58. }
  59. }
  60. int check()
  61. {
  62. int num=0;
  63. for(int i=1;i<=26;i++)
  64. {
  65. if(visit[i]==1&&findfa(i)==i)
  66. num++;
  67. if(num>=2)
  68. return -1;
  69. }
  70. int cnt1=0,cnt2=0;
  71. for(int i=1;i<=26;i++)
  72. {
  73. if(visit[i]==0)
  74. continue;
  75. if(ing[i]==oug[i])
  76. continue;
  77. if(ing[i]==oug[i]+1)
  78. {
  79. cnt1++;continue;
  80. }
  81. if(ing[i]==oug[i]-1)
  82. {
  83. start=i;cnt2++;continue;
  84. }
  85. return -1;
  86. }
  87. if(cnt1==cnt2&&cnt1==0)
  88. return 1;
  89. if(cnt1==cnt2&&cnt1==1)
  90. return 2;
  91. return -1;
  92. }
  93. void init()
  94. {
  95. memset(visit,0,sizeof(visit));
  96. memset(ing,0,sizeof(ing));
  97. memset(oug,0,sizeof(oug));
  98. memset(head,-1,sizeof(head));
  99. cnt=0;
  100. for(int i=1;i<=30;i++)
  101. f[i]=i;
  102. }
  103. int main()
  104. {
  105. int tt;
  106. cin>>tt;
  107. while(tt--)
  108. {
  109. init();
  110. cin>>n;
  111. for(int i=1;i<=n;i++)
  112. cin>>s[i];
  113. sort(s+1,s+1+n,cmp);
  114. for(int i=1;i<=n;i++)
  115. {
  116. m=s[i].size();
  117. x=s[i][0]-'a'+1;y=s[i][m-1]-'a'+1;
  118. add(x,y,i);join(x,y);oug[x]++;ing[y]++;visit[x]=1;visit[y]=1;
  119. }
  120. int xx=check();
  121. if(xx==-1)
  122. cout<<"***\n";
  123. else if(xx==1)
  124. {
  125. dfs(s[1][0]-'a'+1);
  126. int mm=q.size();int cot=0;
  127. while(!q.empty())
  128. {
  129. cot++;
  130. cout<<s[q.top()];q.pop();
  131. if(cot<mm)
  132. cout<<".";
  133. }
  134. cout<<endl;
  135. }
  136. else if(xx==2)
  137. {
  138. dfs(start);
  139. int mm=q.size();int cot=0;
  140. while(!q.empty())
  141. {
  142. cot++;
  143. cout<<s[q.top()];q.pop();
  144. if(cot<mm)
  145. cout<<".";
  146. }
  147. cout<<endl;
  148. }
  149. }
  150. }

  

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. day93之微信推送

    python之微信推送详解 用什么推送   -邮件   -微信推送   -短信推送微信推送   -公众号(不能主动给用户发消息)    -认证的公众号:需要营业执照,需要交钱,可以发多篇文章    - ...

  2. ML.NET 示例:推荐之场感知分解机

    写在前面 准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正. 如果有朋友对此感兴趣,可以加入我:https://github.com/fei ...

  3. Java 控制语句:循环、条件判断

    基础很重要,基础很重要,基础很重要.重要的事情说三遍,. 程序设计中的控制语句主要有三种:顺序.分支和循环.我们每天写的代码,除了业务相关,里面会包含大量的控制语句.但是控制语句的基本使用,是否有些坑 ...

  4. linux上搭建svn服务器

    1.检查当前版本,没有的话用yum安装rpm -qa subversion 2.安装yum install subversion -y 2.建库mkdir -p /home/svn/projectsv ...

  5. oracle表空间不足,ORA-00604的解决方法

    参考文章: http://blog.chinaunix.net/uid-26446098-id-3344813.html 错误信息如下: 从错误的角度可以推出:应该是表空间不足 根据查看表空间的使用情 ...

  6. Leetcode 2. Add Two Numbers(medium)

    You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...

  7. 关于C语言内存的一些理解

    内存这个大话题 key:心里一定要有内存的逻辑图. 程序是什么? 程序 = 代码 + 数据 代码放在Flash中代码段,可变的数据(全局变量.局部变量)放在内存中. 运行程序的目的是什么? 得到运行结 ...

  8. Python入门-文件操作

    文件读取f = open('D:/工作日常/学生空姐模特护士联系方式.txt', 'r', encoding=‘utf-8’)f.read()f.close()解释file='D:/工作日常/学生空姐 ...

  9. Linux登录MySQL时出现 Can't connect to local MySQL server through socket '/tmp/mysql.sock'解决方法

    在Linux上登录MySQL时出现如下提示,如下图: 通过查找资料了解到: MySQL有两种连接方式: (1)TCP/IP (2)socket 对mysql.sock来说,其作用是程序与mysqlse ...

  10. docker之导出、导入、数据搬迁

    docker 导出 导入有二种,一种是备份镜像,一种备份容器.数据搬迁,最简单粗暴就是直接COPY,volume的路径就行了. 一.导出导入镜像 #导出为tar docker save #ID or  ...