传送门:   UVA - 10129

题目大意:

给定一些单词(可能会重复出现),判断单词是否能排成一个序列,前提是单词的最后一个字母与下一个单词的第一个字母相同.输出"The door cannot be opened."(不可能)或者"Ordering is possible."(可能).

单词数小于 10,000,且单个测试的有多组数据.

解题思路:

将单词看作链接首尾字母的边,建图,寻找 一条欧拉路径.(E.P.),需要判断底图(即无向图 或 由有向图看作的无向图)是否连通(连接性),其次是端点的度数(除起始点外(度数为奇),其他点入度应总是等于出度).其中判断来连接性的算法有(紫书P169):

 算法一:DFS

判断能否用邻接表遍历所有边即可,代码后续补上.

算法二:UFS

用并查集判断连通(最适合不过了),详细代码(改自GitHub)

 // 题意:输入n个单词,是否可以排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同
 // 算法:把字母看作结点,单词看成有向边,则有解当且仅当图中有欧拉路径。注意要先判连通
 #include<cstdio>
 #include<cstring>
 #include<vector>
 using namespace std;

  + ;

 // 并查集(代码摘自《算法竞赛入门经典——训练指南》第三章)
 ];
 int findset(int x) { return pa[x] != x ? pa[x] = findset(pa[x]) : x; } 

 ], deg[]; // 是否出现过;度数

 int main() {
   int T;
   scanf("%d", &T);
   while(T--) {
     int n;
     char word[maxn];

     scanf("%d", &n);
     memset(used, , sizeof(used));
     memset(deg, , sizeof(deg));
     for(int ch = 'a'; ch <= 'z'; ch++) pa[ch] = ch; // 初始化并查集
     ; // 连通块个数

     ; i < n; i++) {
       scanf("%s", word);
       ], c2 = word[strlen(word)-];
       deg[c1]++;//出度增
       deg[c2]--;//入度减  <---这份代码的神奇之处
       used[c1] = used[c2] = ;
       int s1 = findset(c1), s2 = findset(c2);
       if(s1 != s2) { pa[s1] = s2; cc--; }//容易写错
     }

     vector<int> d;
     for(int ch = 'a'; ch <= 'z'; ch++) {
       if(!used[ch]) cc--; // 没出现过的字母
       ) d.push_back(deg[ch]);
     }
     bool ok = false;//只存在一个连通块为: 欧拉回路|| 欧拉路径
      && (d.empty() || (d.size() ==  && (d[] ==  || d[] == -)))) ok = true;
     if(ok) printf("Ordering is possible.\n");
     else printf("The door cannot be opened.\n");
   }
   ;
 }

[欧拉路径]Play on Words UVA10129的更多相关文章

  1. Play on Words UVA - 10129 欧拉路径

    关于欧拉回路和欧拉路径 定义:欧拉回路:每条边恰好只走一次,并能回到出发点的路径欧拉路径:经过每一条边一次,但是不要求回到起始点 ①首先看欧拉回路存在性的判定: 一.无向图每个顶点的度数都是偶数,则存 ...

  2. UVA10129 Play on Words —— 欧拉回路

    题目链接:https://vjudge.net/problem/UVA-10129 代码如下: // UVa10129 Play on Words // Rujia Liu // 题意:输入n个单词, ...

  3. 【USACO 3.3】Riding The Fences(欧拉路径)

    题意: 给你每个fence连接的两个点的编号,输出编号序列的字典序最小的路径,满足每个fence必须走且最多走一次. 题解: 本题就是输出欧拉路径. 题目保证给出的图是一定存在欧拉路径,因此找到最小的 ...

  4. hdu 3472 HS BDC(混合路的欧拉路径)

    这题是混合路的欧拉路径问题. 1.判断图的连通性,若不连通,无解. 2.给无向边任意定向,计算每个结点入度和出度之差deg[i].deg[i]为奇数的结点个数只能是0个或2个,否则肯定无解. 3.(若 ...

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

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

  6. nyoj 42 一笔画问题 欧拉路径

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=42 欧拉回路,欧拉路径水题~ 代码: #include "stdio.h&quo ...

  7. UESTC 917 方老师的分身IV --求欧拉路径

    判断欧拉路径是否存在及求出字典序最小的欧拉路径问题(如果存在). 将字符串的第一个字母和最后一个字母间连边,将字母看成点,最多可能有26个点(a-z),如果有欧拉路径,还要判断是否有欧拉回路,如果有, ...

  8. POJ1780 Code(欧拉路径)

    n位密码,要用尽可能短的序列将n位密码的10n种状态的子串都包括,那么要尽量地重合. 题目已经说最短的是10n + n - 1,即每一个状态的后n-1位都和序列中后一个状态的前n-1位重合. 这题是经 ...

  9. hdu 1116 并查集和欧拉路径

    ---恢复内容开始--- 把它看成是一个图 只是需要欧拉路径就可以了 首尾能连成一条线即可 如果要判断这个图是否连通 得用并查集 在hrbust oj里面看答案学到的方法 不用各种for循环套着判断能 ...

随机推荐

  1. HTML5之window.applicationCache对象

    不知道离线缓存技术的可以参照上一篇文章: HTML5之appcache语法理解/HTML5应用程序缓存/manifest缓存文件官方用法翻译 参考文章 window.applicationCache  ...

  2. Noip2016愤怒的小鸟(状压DP)

    题目描述 题意大概就是坐标系上第一象限上有N只猪,每次可以构造一条经过原点且开口向下的抛物线,抛物线可能会经过某一或某些猪,求使所有猪被至少经过一次的抛物线最少数量. 原题中还有一个特殊指令M,对于正 ...

  3. Myeclipse10连接SqlServer2012

    本文纯手打!!!! 对于我们这些刚学java的小白,可是真费劲啊!!!! 要用java连接数据库  首先是要通过JDBC驱动 要先去下载一个sqljdbc4.jar,我这里放百度云盘了, 下载地址:链 ...

  4. LeetCode 697. Degree of an Array (数组的度)

    Given a non-empty array of non-negative integers nums, the degree of this array is defined as the ma ...

  5. VC++6.0在win8.1系统下运行失败的解决办法

    在win8.1系统下安装了VC++6,.0编译软件之后,发现打不开.出现下面的错误: 解决办法: 安装文件目录:Microsoft Visual Studio--common--MSDev98--Bi ...

  6. C++实现引用和被引用对象分离

    上一篇博客简单介绍了C++中引用的底层实现,接下来,通过简单的代码验证如何将引用和被引用对象分离. 代码如下; #include <iostream> #include<string ...

  7. Summer Holiday

    Summer Holiday Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  8. Good Luck in CET-4 Everybody!

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  9. 【开源】【前后端分离】【优雅编码】分享我工作中的一款MVC+EF+IoC+Layui前后端分离的框架——【NO.1】框架概述

    写博客之前总想说点什么,但写的时候又忘了想说点什么,算了,不说了,还是来送福利吧. 今天是来分享我在平时工作中搭建的一套前后端分离的框架. 平时工作大多时候都是在做管理类型的软件开发,无非就是增.删. ...

  10. 【Aladdin Unity3D Shader编程】之三 光照模型(二)

    高光反射模型 Specular=直射光*pow(cosθ,高光的参数) θ:是反射光和视野方向的夹角 编写高光反射Shader Shader "AladdinShader/07 Specul ...