1 /*
  2    NYOJ 99单词拼接:
  3    思路:欧拉回路或者欧拉路的搜索!
  4    注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE!
  5    有向图的欧拉路:abs(In[i] - Out[i])==1(入度[i] - 出度[i])的节点个数为两个
  6    有向图的欧拉回路:所有的节点都有In[i]==Out[i]
  7 */
  8 #include<iostream>
  9 #include<cstring>
 10 #include<cstdio>
 11 #include<algorithm>
 12 using namespace std;
 13
 14 struct node{
 15    char s[35];
 16    int first, end;
 17 };
 18
 19 bool cmp(node a, node b){
 20    return strcmp(a.s, b.s) <0;
 21 }
 22
 23 node nd[1005];
 24 int In[30], Out[30];
 25 int order[1005], vis[1005];
 26 int n;
 27
 28 int fun(){
 29     memset(vis, 0, sizeof(vis));
 30     int i;
 31     int last=-1;
 32     int first=-1;
 33     //有向图欧拉路的判断
 34     for(i=0; i<26; ++i)
 35     {
 36         if(In[i]!=Out[i])
 37         {   //首先入度和出度之差的绝对值为 1的节点的要么没有,要么只有两个(没有欧拉回路,只有欧拉路)!
 38             if(Out[i]-In[i]==1 && first==-1)
 39                 first=i;
 40             else if(Out[i]-In[i]==-1 && last==-1)
 41                 last=i;
 42             else
 43                 return -1;
 44         }
 45     }
 46     if(first>-1 && last>-1) //这种情况是 欧拉路的搜索 !
 47         return first;
 48     else if(first==-1 && last==-1) //这种是欧拉回路的搜索!
 49     {
 50         for(i=0; i<26; ++i)
 51             if(In[i]!=0)
 52                 return i;
 53     }
 54     else
 55         return -1;
 56 }
 57
 58 bool dfs(int st, int cnt){
 59    if(cnt == n)
 60       return true;
 61    int ld=0, rd=n-1;
 62    while(ld<=rd){
 63        int mid=(ld+rd)/2;
 64        if(nd[mid].first<st)
 65            ld=mid+1;
 66        else rd=mid-1;
 67    }
 68    int m=rd+1;
 69    if(nd[m].first > st) return false;
 70    for(int i=m; i<n; ++i)
 71       if(!vis[i]){
 72             if(nd[i].first > st)
 73                return false;
 74             if(nd[i].first == st){
 75               vis[i]=1;
 76               order[cnt]=i;
 77               if(dfs(nd[i].end, cnt+1)) return true;
 78               vis[i]=0;
 79           }
 80       }
 81    return false;
 82 }
 83
 84
 85 int main(){
 86    int t;
 87    scanf("%d", &t);
 88    while(t--){
 89       scanf("%d", &n);
 90       memset(In, 0, sizeof(In));
 91       memset(Out, 0, sizeof(Out));
 92       for(int i=0; i<n; ++i){
 93          scanf("%s", nd[i].s);
 94          nd[i].first=nd[i].s[0]-'a';
 95          nd[i].end=nd[i].s[strlen(nd[i].s)-1]-'a';
 96          ++Out[nd[i].first];
 97          ++In[nd[i].end];
 98       }
 99
100          int st = fun();
101          //因为搜索的是字典序的第一个,所以将字符串从小到大排一下序!在搜索的时候按照升序搜索组合!
102          sort(nd, nd+n, cmp);
103          if(st==-1 || !dfs(st, 0))
104             printf("***\n");
105          else{
106             printf("%s", nd[order[0]].s);
107             for(int i=1; i<n; ++i)
108                printf(".%s", nd[order[i]].s);
109             printf("\n");
110          }
111    }
112    return 0;
113 } 

转载于:https://www.cnblogs.com/hujunzheng/p/3900428.html

NYOJ 99单词拼接(有向图的欧拉(回)路)相关推荐

  1. NYOJ 99 单词拼接

    单词拼接 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同. 如 alo ...

  2. 1341:【例题】一笔画问题——欧拉(回)路

    [题目描述] 如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路. 根据一笔画的两个定理,如果寻找欧拉回路,对任意一个点执行深度优先遍历:找欧拉路,则对一个奇点 ...

  3. NYOJ-99 单词拼接(欧拉+回溯)

    单词拼接 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同. 如 alo ...

  4. C语言DFS(7)___单词拼接(NYoj 99)

    单词拼接 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下一个单词的道字母相同. 如 aloha dog arachnid gopher tiger rat 可以拼 ...

  5. NYOJ - 99:单词拼接

    单词拼接 来源:NYOJ 标签:图论,欧拉图,欧拉路径 参考资料: 欧拉图:https://baike.baidu.com/item/%E6%AC%A7%E6%8B%89%E5%9B%BE 相似题目: ...

  6. #1182 : 欧拉路·三(有向图的欧拉路)

    #1182 : 欧拉路·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho破解了一道又一道难题,终于来到了最后一关.只要打开眼前的宝箱就可以通关这个游戏了 ...

  7. UVA 10129 Play on Words(欧拉道路)

    题意:给你n个字符串,问你是否可以出现一条链,保证链中每个字符串的第一个元素与上一个字符串的最后一个元素相同,注意可能重复出现同一个字符串 题解:以每一个字符串第一个元素指向最后一个元素形成一个有向图 ...

  8. 宏光MINI EV收割的年轻人,又被苏宁、小米、欧拉盯上了

    (图片来源于网络,侵删) 文 | 螳螂财经(ID:TanglangFin) 作者|易不二 "人民需要什么,五菱就造什么." 五菱这句话很真诚,但毫无疑问有吹牛的成份在.毕竟,人类的 ...

  9. 欧拉通路 java,欧拉回路

    基本概念及定理 1. 欧拉通路.欧拉回路.欧拉图 无向图: 1) 设G是连通无向图,则称经过G的每条边一次并且仅一次的路径为欧拉通路: 2) 如果欧拉通路是回路(起点和终点是同一个顶点),则称此回路为 ...

最新文章

  1. 命令行程序增加 GUI 外壳
  2. 利用css对input[type=file] 样式进行美化,input上传按钮美化
  3. 关系运算符、逻辑 运算符与三元运算符
  4. NOVA 日志报错解决办法
  5. zabbix应用之短信报警
  6. 手机连接服务器传输文件,手机云服务器传输文件
  7. VTK修炼之道24:图像基本操作_单颜色通道图像合成彩色
  8. SAP Spartacus本地启动时的白屏问题分析
  9. GatewayWorker Not Support On Windows.
  10. 前端学习(1832):前端面试题之跨域
  11. python命令窗口中怎么导入numpy_科学网—windows7下python3.6如何导入numpy,Astropy - 杨涛只的博文...
  12. java8 日期比较_20 个案例教你在 Java 8 中如何处理日期和时间?
  13. python中两个文件如何互相传参_argparse模块如何在jupyter notebook中用于传参?
  14. 谷歌升级AutoML,可用于大规模图像分类和物体检测
  15. linux与mac和windows的 文件共享
  16. 网站速度优化模块HttpCompressionModule
  17. 【校招VIP】产品行测考察之逻辑推理
  18. 线性代数的本质(Essense Of Linear Algebra)[2]
  19. 机器学习之【蒙特卡罗法】
  20. 共享单车公司每年花上亿元赎车

热门文章

  1. docker: Error response from daemon: driver failed programming external connectivity
  2. @webservice报错org.apache.cxf.common.i18n.UncheckedException: No operation was found with
  3. 导入Oracle 数据库镜像,创建Oracle虚拟机_01
  4. SpringMVC 集成 mybatisPlus 分析
  5. gradle下载及配置
  6. 系统架构设计师 - 软件架构设计 - 基于架构开发方法 ABSD (Architecture-Based Soft Design)
  7. Mybatis 常用语句
  8. Java-Scanner进阶使用
  9. android翻盘效果,行情艰难,Android初中级面试题助你逆风翻盘,每题都有详细答案...
  10. 运营商服务器系统,浪潮服务器助力运营商三大支撑系统上云