例题6-16 单词 UVa10129
1.题目描写叙述:点击打开链接
2.解题思路:本题利用欧拉回路存在条件解决。
能够将全部的单词看做边,26个字母看做端点,那么本题事实上就是问是否存在一条路径,能够到达全部出现过的字符端点。
因为本题还要求了两个单词拼在一起的条件是前一个单词的右端点和本单词的左端点一样。所以这是一个有向图。依据结论:有向图的底图(忽略边的方向后的图)必须连通;有向图中最多仅仅能有两个端点的入度不等于出度。且必须是当中一点的入度比出度小1,还有一点的入度比出度大1。因此先推断端点是否都连通,再推断每一个端点的度数是否满足结论就可以。
那么,怎样推断连通性呢?第一种方法是利用DFS。另外一种方法能够利用并查集。
本题利用并查集来推断是否连通。
3.代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std; #define N 100000+10
int u[N], v[N];
int din[26], dout[26],vis[26];
int p[N];
int n;
void clear()
{
memset(p, 0, sizeof(p));
memset(vis, 0, sizeof(vis));
memset(din, 0, sizeof(din));
memset(dout, 0, sizeof(dout));
}
int find(int x)
{
return p[x] == x ? x : p[x] = find(p[x]);
}
bool is_connected()//利用并查集来推断底图是否连通
{
for (int i = 0; i < 26; i++)p[i] = i;
for (int i = 0; i < n; i++)
{
int x = find(u[i]), y = find(v[i]);
if (x != y)p[x] = y;
}
int i = 0;
for (i; !vis[i]; i++);
int x = find(i);
for (int j = i + 1; j < 26;j++)
if (vis[j])
{
int y = find(j);
if (x != y)return false;
}
return true;
} int main()
{
//freopen("t.txt", "r", stdin);
int T;
scanf("%d", &T);
while (T--)
{
clear();
scanf("%d", &n);
char s[1000 + 10];
for (int i = 0; i < n; i++)
{
scanf("%s", s);
int len = strlen(s);
u[i] = s[0] - 'a', v[i] = s[len - 1] - 'a';
dout[u[i]]++, din[v[i]]++;//统计入度,出度
vis[u[i]] = 1, vis[v[i]] = 1; //标记出现过的字符
}
int ok = 1;
if (is_connected())
{
int cnt = 0;
for (int i = 0; i < 26;i++)
if (vis[i])
{
if (din[i] != dout[i])
{
if (din[i] == dout[i] - 1)cnt++;
else if (din[i] == dout[i] + 1)cnt++;
else{ ok = 0; break; }
}
if (cnt>2){ ok = 0; break; }
}
}
else ok = 0;
if (ok)puts("Ordering is possible.");
else puts("The door cannot be opened.");
}
return 0;
}
例题6-16 单词 UVa10129的更多相关文章
- C. 【例题3】单词替换
C . [ 例 题 3 ] 单 词 替 换 解析 可以一个个单词读取,输入完之后, 讲整个句子的每个单词遍历一次, 如果这个单词是与单词 a a a相同的话, 就输出 b b b, 否则输出这个单词 ...
- 6-16 单词 uva10129
了解了欧拉回路和欧拉道路的性质 : 欧拉道路 最多只有两个奇点(不可能只有一个奇点) 并且当有两个奇点的时候 一个奇点入比出多一 一个奇点出比入多一 采用并查集查看是否连同 如果连 ...
- C# 正则表达式
引用自:http://www.cnblogs.com/stg609/archive/2009/06/03/1492709.html 摘要:正则表达式(Regular Expressions),相信做软 ...
- C#基础回顾:正则表达式
C#基础回顾:正则表达式 写在前面:本文根据笔者的学习体会结合相关书籍资料对正则表达式的语法和使用(C#)进行基本的介绍.适用于初学者. 摘要:正则表达式(Regular Expressions),相 ...
- C#基础回顾:正则表达式-转
写在前面:本文根据笔者的学习体会结合相关书籍资料对正则表达式的语法和使用(C#)进行基本的介绍.适用于初学者. 摘要:正则表达式(Regular Expressions),相信做软件开发的朋友或多或少 ...
- OI题目类型总结整理
## 本蒟蒻的小整理qwq--持续更新(咕咕咕) 数据结构 数据结构 知识点梳理 数据结构--线段树 推荐yyb dalao的总结--戳我 以后维护线段树还是把l,r写到struct里面吧,也别写le ...
- (浙江金华)Day 1 组合数计数
目录 Day 1 组合计数 1.组合数 (1).C(n,m) 读作n选m,二项式系数 : (2).n个东西里选m个的方案数 不关心选的顺序: (3).二项式系数--->多项式系数: 2.组合数计 ...
- 浅析 AC 自动机
目录 简述 AC 自动机是什么 AC 自动机有什么用 AC 自动机·初探 AC 自动机·原理分析 AC 自动机·代码实现 AC 自动机·更进一步 第一题 第二题 第三题 从 AC 自动机到 fail ...
- ybt的坑
emmmm ybt 字符串处理 例2题解错了 AC自动机板子错了(据说) 另外字符串处理的题解写的我一脸懵逼 网站上eeeee 点击查看E. 1.排队接水 #include <iostream& ...
随机推荐
- Oracle学习记录1
1.current_date与sysdate区别 在oracle中current_date与sysdate都是显示当前系统时间, 其结果基本相同,但是有三点区别:a. current_date返回的是 ...
- chroot下二进制程序迁移
#!/bin/bash # #define function#Copy binary programcp_bin(){ cmd_dir=${cmd_path%/*} [ ! -d /mnt/sysro ...
- facebook面试题【转】
1. 给两个类A和Bclass A {public void foo (A a) { ...}}class B extends A {public void foo (B b) { ...}}问这么写 ...
- ubuntu下打开windows里的txt文件乱码解决
是编码问题引起的问题: Linux下默认的编码是UTF-8,而Windows下默认的编码是GB2312/GBK.执行如下第一条语句即可 gsettings set org.gnome.gedit.pr ...
- Xamarin.Forms的ActivityIndicator和ProgressBar比较
Xamarin.Forms的ActivityIndicator和ProgressBar比较 在Xamarin.Forms中,控件ActivityIndicator和ProgressBar都用来表示 ...
- Ural 1780 Gray Code 乱搞暴力
原题链接:http://acm.timus.ru/problem.aspx?space=1&num=1780 1780. Gray Code Time limit: 0.5 secondMem ...
- [HEOI2015]定价
题目描述 在市场上有很多商品的定价类似于 999 元.4999 元.8999 元这样.它们和 1000 元.5000 元和 9000 元并没有什么本质区别,但是在心理学上会让人感觉便宜很多,因此也是商 ...
- 笔记-迎难而上之Java基础进阶6
import java.io.*; public class InputStreamDemo{ public static void main(String[] args) throws IOExce ...
- commons-lang3工具类学习--------ObjectUtils
Object工具类 allNotNull(Object... values) 检查所有元素是否为空,返回一个boolean 如果有一个元素为空返回false,所有元素不为空或元素为empty返回tru ...
- Android 中的Canvas画图
Android中有一个Canvas类,Canvas类就是表示一块画布,你可以在上面画你想画的东西.当然,你还可以设置画布的属性,如画布的颜色/尺寸等.Canvas提供了如下一些方法: Canvas() ...