了解了欧拉回路和欧拉道路的性质 :

欧拉道路  最多只有两个奇点(不可能只有一个奇点)     并且当有两个奇点的时候  一个奇点入比出多一   一个奇点出比入多一

采用并查集查看是否连同   如果连通块大于等于2  显然不成立

然后判断 入数组 和出数组的个数  当处于个数不相同的时候说明有奇点   判断此时一个为入奇点 一个为出奇点!!

十分巧妙

根据查找连通性不同  有两种方式:

并查集

#include<bits/stdc++.h>
using namespace std;
int f[];
int vis[];
int in[];
int out[]; int find1(int x)
{
return f[x]==x?x:f[x]=find1( f[x] );
} void uni(int a,int b)
{
if(find1(a)!=find1(b))
{
f[a]=b;
}
} char m1[][];
char m2[][]; int main()
{ int cas;cin>>cas;
while(cas--)
{
int n;cin>>n;
memset(vis,,sizeof(vis));
memset(in,,sizeof(in));
memset(out,,sizeof(out));
for(int i=;i<;i++) f[i]=i;
string s;getchar();
while(n--)
{
getline(cin,s);
in[s[]-'a' ]++; out[s[s.size()-]-'a' ]++;
vis[ s[]-'a' ]=vis[ s[s.size()-]-'a' ]=; uni( f[s[]-'a'],f[s[s.size()-]-'a' ]);
} int cnt=;
for(int i=;i<;i++)
{
if(vis[i]&&f[i]==i)cnt++;
}
if(cnt>=){printf("The door cannot be opened.\n");continue;} int ru=-,chu=-; int ok=;
for(int i=;i<;i++)
{ if(vis[i]&&in[i]!=out[i])
{
if(in[i]==out[i]+&&ru==-)ru=;
else if(in[i]==out[i]-&&chu==-)chu=;
else ok=;
} } if(ok)printf("Ordering is possible.\n");
else printf("The door cannot be opened.\n"); } return ;
}

DFS

#include<cstring>
#include<iostream>
#include<cstdio>
#include<cmath>
#define MAXN 100
using namespace std;
int vis[MAXN],G[MAXN][MAXN],N, T,f[MAXN],rank[MAXN], in[MAXN],out[MAXN]; void dfs(int u){
vis[u] = true;
for(int i=; i<MAXN; ++i){
if(G[u][i] && !vis[i])
dfs(i);
}
} int main(){ freopen("input.txt","r",stdin);
scanf("%d",&T);
while(T--){
memset(G, , sizeof(G));
memset(in, , sizeof(in));
memset(out, , sizeof(out)); char str[]; scanf("%d",&N); for(int i=; i<N; ++i){
scanf("%s", str);
++G[str[]-'a'][str[strlen(str)-]-'a'];
++out[str[]-'a'];
++in[str[strlen(str)-]-'a'];
} bool flag=true; int num1=, num2=;
for(int i=; i<MAXN; ++i){
if(!flag) break;
if(in[i]!=out[i]){
if(in[i]==out[i]+) { ++num1; }
else if(out[i]==in[i]+) { ++num2; }
else {flag=false; break; }
}
} if(num1 && num2 && num1+num2>) flag=false; if(flag){
memset(vis, , sizeof(vis));
for(int i=; i<MAXN; ++i)
if(out[i]) { dfs(i); break; } bool flag2=true;
for(int i=; i<MAXN; ++i){
if(in[i] && !vis[i]) { flag2=false; break; }
if(out[i] && !vis[i]) { flag2=false; break; }
}
if(flag2) printf("Ordering is possible.\n");
else printf("The door cannot be opened.\n");
}
else{
printf("The door cannot be opened.\n");
}
}
return ;
}

6-16 单词 uva10129的更多相关文章

  1. 例题6-16 单词 UVa10129

    1.题目描写叙述:点击打开链接 2.解题思路:本题利用欧拉回路存在条件解决. 能够将全部的单词看做边,26个字母看做端点,那么本题事实上就是问是否存在一条路径,能够到达全部出现过的字符端点. 因为本题 ...

  2. C# 正则表达式

    引用自:http://www.cnblogs.com/stg609/archive/2009/06/03/1492709.html 摘要:正则表达式(Regular Expressions),相信做软 ...

  3. C#基础回顾:正则表达式

    C#基础回顾:正则表达式 写在前面:本文根据笔者的学习体会结合相关书籍资料对正则表达式的语法和使用(C#)进行基本的介绍.适用于初学者. 摘要:正则表达式(Regular Expressions),相 ...

  4. C#基础回顾:正则表达式-转

    写在前面:本文根据笔者的学习体会结合相关书籍资料对正则表达式的语法和使用(C#)进行基本的介绍.适用于初学者. 摘要:正则表达式(Regular Expressions),相信做软件开发的朋友或多或少 ...

  5. 6_16 单词(UVa10129)<欧拉回路>

    考古学家有时候遇到一些神秘的门,这些门需要解开特定的谜题才能打开.因为没有其他方法可以打开门,这谜题对我们来说非常重要.在门上有许多磁盘,每个盘子上有一个英文单字在上面.这些盘子必须被安排,使得盘子上 ...

  6. [LeetCode] Maximum Product of Word Lengths 单词长度的最大积

    Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...

  7. [LeetCode] Substring with Concatenation of All Words 串联所有单词的子串

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...

  8. 做中学(Learning by Doing)之背单词-扇贝网推荐

    做中学(Learning by Doing)之背单词-扇贝网推荐 看完杨贵福老师(博客,知乎专栏,豆瓣)的「继续背单词,8个月过去了」,我就有写这篇文章的冲动了,杨老师说: 有时候我会感觉非常后悔,如 ...

  9. 单词words

    论一类脑筋急转弯题和奇技淫巧题的解题技巧 [题意] 给定n个长为m且只包含xyz的字符串,定义两个字符串的相似程度为它们对应位置相同字符个数(比如xyz和yyz的相似程度为2,后两位相同),分别求出相 ...

随机推荐

  1. 绘图QPainter-画笔

    绘图要在paintEvent()方法中实现.在QPainter对象的begin()与end()方法间编写绘图代码.它会在控件或其他图形设备上进行低级的图形绘制 画笔样式Penstyle Qt.Nope ...

  2. luogu P2480 [SDOI2010]古代猪文

    M_sea:这道题你分析完后就是一堆板子 废话 理解完题意后,我们要求的东西是\(G^s(s=\sum_{d|n} \binom{n}{d})\) 但是这个指数\(s\)算出来非常大,,, 我们可以利 ...

  3. 使用block的时候,导致的内存泄漏

    明确,只要在block里边用到我们自己的东西,成员变量,self之类的,我们都需要将其拿出来,把它做成弱指针以便之后进行释放. 在ZPShareViewController这个控制器中,由如下代码: ...

  4. ubuntu 禁用 nouveau 方法

    (1)直接移除这个驱动(备份出来) $ mv /lib/modules/4.4.0-31-generic/kernel/drivers/gpu/drm/nouveau/nouveau.ko /lib/ ...

  5. linux 高级字符设备驱动 ioctl操作介绍 例程分析实现【转】

    转自:http://my.oschina.net/u/274829/blog/285014 1,ioctl介绍 ioctl控制设备读写数据以及关闭等. 用户空间函数原型:int ioctl(int f ...

  6. bat判断ini文件内容

    @echo off for /f "tokens=1" %%d in (config.ini) do ( if /I "%%d" equ "path= ...

  7. SQLServer语言之DDL,DML,DCL,TCL

    数据库语言分类 SQLServer   SQL主要分成四部分: (1)数据定义.(SQL DDL)用于定义SQL模式.基本表.视图和索引的创建和撤消操作. (2)数据操纵.(SQL DML)数据操纵分 ...

  8. [bzoj3123][洛谷P3302] [SDOI2013]森林(树上主席树+启发式合并)

    传送门 突然发现好像没有那么难……https://blog.csdn.net/stone41123/article/details/78167288 首先有两个操作,一个查询,一个连接 查询的话,直接 ...

  9. 007_linux显示一个文件的某几行(中间几行)

    <1>从第3000行开始,显示1000行.即显示3000~3999行 cat -n filename | tail -n +3000 | head -n 1000 cat -n anaco ...

  10. git 的入门使用到团队协作

    1.git 的安装.下载---安装,esay. 下载地址:https://git-for-windows.github.io/ 2.创建一个自己的身份 git config --global user ...