Play on Words
poj1386:http://poj.org/problem?id=1386
题意:给你n个单词,问你是否能够通过调整单词的顺序存在这样的一个序列,使得 每个单词的首字母是前一个单词的尾字母。
题解:每个单词可以看做从首字母连向尾字母的一条边,然后就是整个图的欧拉路径。统计每个点的入度和初度,如果基图连通,并且只有两个点入度和初度不等,并且相差分别为1,-1,就存在这样的路径,否则则没。 连通性,可以用并查集. 处理完之后,看每个点的父亲是否相等来判断是否连通。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int in[], pa[], out[];// 统计入度,初读
bool used[];//记录出现过的字母
int n;//单词的个数
char str[];//读取单词
void UFset(){//初始化
for(int i=;i<=;i++){
used[i]=;
pa[i]=-;
out[i]=;
in[i]=;
}
}
int Find(int x){//查找
int s;
for(s=x;pa[s]>=;s=pa[s]);
while(s!=x){
int temp=pa[x];
pa[x]=s;
x=temp;
}
return s;
}
void Union(int R1,int R2){//合并
int r1=Find(R1);
int r2=Find(R2);
int temp=pa[r1]+pa[r2];
if(pa[r1]>pa[r2]){
pa[r1]=r2;
pa[r2]=temp;
}
else{
pa[r2]=r1;
pa[r1]=temp;
}
}
bool solve(){//判断连通性
int first=-;
for(int i=;i<=;i++){
if(!used[i])continue;
if(first==-)first=Find(i);
else if(first!=Find(i))return false;
}
return true;
}
int main(){
int cas;
scanf("%d",&cas);
while(cas--){
scanf("%d",&n);
UFset();
for(int i=;i<=n;i++){//建图
scanf("%s",str);
int len=strlen(str);
int u=str[]-'a'+;
int v=str[len-]-'a'+;
in[v]++;
used[v]=true;
out[u]++;used[u]=true;
if(Find(u)!=Find(v))
Union(u,v);
}
int one=,one1=;bool flag=true;
for(int j=;j<=;j++){
if(!used[j])continue;
if(out[j]-in[j]>=||in[j]-out[j]>=){
flag=false;
break;
}
if(out[j]-in[j]==){
one++;
if(one>)
{flag=false;break;}
}
if(out[j]-in[j]==-){
one1++;
if(one1>){
flag=false;break;
}
}
}
if(one!=one1)flag=false;
if(!solve())flag=false;
if(flag)printf("Ordering is possible.\n");
else
printf("The door cannot be opened.\n");
}
}
随机推荐
- mount命令以及mount ntfs硬盘权限权限与显示的问题 分类: shell ubuntu 2014-11-08 18:29 148人阅读 评论(0) 收藏
sudo mount -t 文件系统类型 -o 可设置选项 设备路经 访问路经 #常用文件类型如下: iso9660 光驱文件系统, vfat fat/fat32分区, ntfs ntfs分区, sm ...
- android 31 GridView
GridView:网格列表,也支持适配器. package com.sxt.day05_01; import java.util.ArrayList; import java.util.List; i ...
- 四种数据持久化方式(下) :SQLite3 和 Core Data
在上文,我们介绍了iOS开发中的其中2种数据持久化方式:属性列表.归档解档. 本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文 ...
- 如何判断Fragment是否对用户可见
背景 最近在开发中遇到了一个问题.我们的app需要统计用户的页面路径,也就是用户使用各个页面的情况.这就需要在不同的页面跳入和跳出时记录下来.但是我们的app主要是由Fragment构成的.而在不同的 ...
- MD5 密码破解 碰撞 网站
MD5反向查询网站 http://www.cmd5.com/ 文件MD5值查询网站 http://www.atool.org/file_hash.php 个人对密码破解的理解 1.使用MD5对密码加密 ...
- plsql 显式游标
显式游标的处理过程包括: 声明游标,打开游标,检索游标,关闭游标. 声明游标 CURSOR c_cursor_name IS statement; 游标相当于一个查询结果集,将查询的结果放在游标里,方 ...
- weex APIs
1.通过这个$vm()上下文访问这些api在脚本的方法 <script> module.exports = { methods: { somemethod: function() { th ...
- Erlang - Download and Install for Linux
1. 下载 Erlang [huey@huey-K42JE erlang]$ wget http://www.erlang.org/download/otp_src_R16B03.tar.gz 2. ...
- 基于slf4j的log4j实战
参考文档如下: http://blog.csdn.net/anialy/article/details/8529188 slf4j是接口,基于门面模式,可以实现log4j和logback 参考文档如下 ...
- jni使用
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 简介 详解 JNI 元素 JNI函数实战 AndroidmkApplicationmk Androidmk Applicat ...