UVA-10129 Play on Words (判断欧拉道路的存在性)
题目大意:给出一系列单词,当某个单词的首字母和前一个单词的尾字母相同,则这两个单词能链接起来。给出一系列单词,问是否能够连起来。
题目分析:以单词的首尾字母为点,单词为边建立有向图,便是判断图中是否存在欧拉道路。有向图中存在欧拉路径的两个条件是:1、忽略边的方向性后,底图联通;2、奇点个数为0时、奇点个数为2并且满足起点的入度比出度小1和终点的出度比入度大1时,欧拉道路一定存在;
判断图的连通性有两种方法:1、利用并查集,只判断有几个根节点即可;2、使用DFS,做法实质上就是判断联通块的个数;
利用并查集:
# include<iostream>
# include<cstdio>
# include<map>
# include<set>
# include<string>
# include<cstring>
# include<algorithm>
using namespace std; int n,in[26],out[26],fa[26],mark[26];
char p[1005]; int fin(int u)
{
int x=u;
while(fa[u]!=u)
u=fa[u];
while(fa[x]!=u){
int k=fa[x];
fa[x]=u;
x=k;
}
return u;
} int get()
{
int cnt=0;
for(int i=0;i<26;++i)
if(mark[i]&&fa[i]==i)
++cnt;
return cnt;
} bool judge()
{
if(get()>1)
return false; int cnt=0;
for(int i=0;i<26;++i)
if(mark[i]&&in[i]!=out[i])
++cnt;
if(cnt>2)
return false;
if(cnt==0)
return true;
if(cnt==1)
return false; int k1=0,k2=0;
for(int i=0;i<26;++i){
if(mark[i]&&in[i]!=out[i]){
if(in[i]+1==out[i])
k1=1;
if(in[i]==out[i]+1)
k2=1;
}
}
return k1&&k2;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(mark,0,sizeof(mark));
for(int i=0;i<26;++i) fa[i]=i;
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%s",p);
int l=strlen(p);
mark[p[0]-'a']=mark[p[l-1]-'a']=1;
++out[p[0]-'a'];
++in[p[l-1]-'a'];
int u=fin(p[0]-'a');
int v=fin(p[l-1]-'a');
if(u!=v)
fa[u]=v;
}
if(judge())
printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n");
}
return 0;
}
使用DFS:
# include<iostream>
# include<cstdio>
# include<map>
# include<set>
# include<string>
# include<cstring>
# include<algorithm>
using namespace std; int n,in[26],out[26],mark[26],vis[26],mp[26][26];
char p[1005]; void dfs(int u)
{
for(int i=0;i<26;++i){
if(mark[i]&&!vis[i]&&mp[u][i]){
vis[i]=1;
dfs(i);
}
}
} bool judge()
{
int cnt=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<26;++i){
if(mark[i]&&!vis[i]){
++cnt;
vis[i]=1;
dfs(i);
}
}
if(cnt>1)
return false; for(int i=0;i<26;++i)
if(mark[i]&&vis[i]==0)
return false; cnt=0;
for(int i=0;i<26;++i)
if(mark[i]&&in[i]!=out[i])
++cnt;
if(cnt>2)
return false;
if(cnt==0)
return true;
if(cnt==1)
return false; int k1=0,k2=0;
for(int i=0;i<26;++i){
if(mark[i]&&in[i]!=out[i]){
if(in[i]+1==out[i])
k1=1;
if(in[i]==out[i]+1)
k2=1;
}
}
return k1&&k2;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(in,0,sizeof(in));
memset(mp,0,sizeof(mp));
memset(out,0,sizeof(out));
memset(mark,0,sizeof(mark));
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%s",p);
int l=strlen(p);
mp[p[0]-'a'][p[l-1]-'a']=mark[p[0]-'a']=mark[p[l-1]-'a']=1;
++out[p[0]-'a'];
++in[p[l-1]-'a'];
} if(judge())
printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n");
}
return 0;
}
UVA-10129 Play on Words (判断欧拉道路的存在性)的更多相关文章
- UVa 10129 Play On Words【欧拉道路 并查集 】
题意:给出n个单词,问这n个单词能否首尾接龙,即能否构成欧拉道路 按照紫书上的思路:用并查集来做,取每一个单词的第一个字母,和最后一个字母进行并查集的操作 但这道题目是欧拉道路(下面摘自http:// ...
- UVA 10129 Play on Words(欧拉道路)
题意:给你n个字符串,问你是否可以出现一条链,保证链中每个字符串的第一个元素与上一个字符串的最后一个元素相同,注意可能重复出现同一个字符串 题解:以每一个字符串第一个元素指向最后一个元素形成一个有向图 ...
- Uva 10129 - Play on Words 单词接龙 欧拉道路应用
跟Uva 10054很像,不过这题的单词是不能反向的,所以是有向图,判断欧拉道路. 关于欧拉道路(from Titanium大神): 判断有向图是否有欧拉路 1.判断有向图的基图(即有向图转化为无向图 ...
- UVA 10441 - Catenyms(欧拉道路)
UVA 10441 - Catenyms 题目链接 题意:给定一些单词,求拼接起来,字典序最小的,注意这里的字典序为一个个单词比过去,并非一个个字母 思路:欧拉回路.利用并查集判联通,然后欧拉道路判定 ...
- 【UVa】12118 Inspector's Dilemma(欧拉道路)
题目 题目 分析 很巧秒的一道题目,对着绿书瞎yy一会. 联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2.这样不断相加的和加上e再乘以t就是答案, ...
- Nyoj42 一笔画问题 (欧拉道路)
http://acm.nyist.net/JudgeOnline/problem.php?pid=42题目链接 #include <cstdio> #include <cstring ...
- POJ 2513 Colored Sticks(欧拉道路+字典树+并查集)
http://poj.org/problem?id=2513 题意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 思路: 题目很明 ...
- UVA10129———欧拉道路
题目 输入n(n≤100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如 acm,malform,mouse).每个单词最多包含1000 ...
- poj2480(利用欧拉函数的积性求解)
题目链接: http://poj.org/problem?id=2480 题意:∑gcd(i, N) 1<=i <=N,就这个公式,给你一个n,让你求sum=gcd(1,n)+gcd(2, ...
随机推荐
- Solutions for common Android development problems with the Eclipse IDE- Tutorial
Table of Contents 1. Solving typical Android development problems 1.1. Clean Project 1.2. android.co ...
- python网络编程知识体系
python的网络编程包括: 1.mvc-socket-线程-进程-并发-IO异步-消费者生产者 2.mysql-paramiko-审计堡垒机-redis-分布式监控 线程.进程 和 协程 原理剖析 ...
- android的selector选择器
1. drawable/actionbar_compat_item.xml 2.drawable/actionbar_compat_item_pressed.xml 3.drawable/action ...
- 迁移学习与fine-tuning有什么区别
假设你要处理一个新数据集,让你做图片分类,这个数据集是关于Flowers的,问题是,数据集中flower的类别很少,数据集中的数据也不多,你发现从零开始训练CNN的效果很差,很容易过拟合,怎么办呢,于 ...
- [转载]WorldWind实时确定、更新、初始化和渲染地形和纹理数据
WorldWind实时确定.更新.初始化和渲染地形和纹理数据 原文链接: http://www.cnblogs.com/rainbow70626/p/5597267.html 当用户点击WorldWi ...
- /etc/rc.d/rc.local linux启动自动开启某些服务(转)
/etc/rc.d/rc.local似乎是很多Linux系统管理员的偏爱,因为凡是需要随系统自动启动的服务.程序等,只要系统没有提供Sys V风格的启动脚本,就把这些需求都塞到/etc/rc.d/rc ...
- 什么是API测试
什么是API API是Application Programming Interface的简写. 实现了两个或多个独立系统或模块间的通信和数据交换能力. 什么是API测试 图片.png API测试是不 ...
- Cocos2d-JS实现的打飞机
一.前言 今天我们来讲一个最最最常见的一个小游戏--打飞机!是的,打飞机!还记得小时候在玩儿的雷电,应该是打飞机最早的样子了吧.直到现在,也有微信打飞机,全民飞机大战,全民打飞机等游戏的出现,这些游戏 ...
- 2.4 The Object Model -- Computed Properties and Aggregate Data with @each(计算的属性和使用@each聚合数据)
1. 通常,你可能有一个计算的属性依赖于数组中的所有元素来确定它的值.例如,你可能想要计算controller中所有todo items的数量,以此来确定完成了多少任务. export default ...
- VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)
上一节鸡啄米讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 鸡啄米已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将 ...