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");
}
}

随机推荐

  1. shuffle() 函数(转)

    定义和用法 shuffle() 函数把数组中的元素按随机顺序重新排列. 若成功,则返回 TRUE,否则返回 FALSE. 注释:本函数为数组中的单元赋予新的键名.这将删除原有的键名而不仅是重新排序. ...

  2. 实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序

    P.bhw98 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 9pt; PADDING-BOTTOM: 0px; MARGIN: 10px 0 ...

  3. JSON 入门

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...

  4. 关于C++的疑问剖析

    1)众所周知,抽象类是不存在对象的,只提供接口而不提供实现.但是抽象类能不能作为一个类指针,指向其子类的对象呢? class Interface { public: ; }; class Implem ...

  5. 关于struts2中action请求会执行两次的问题

    关于struts2中action请求会执行两次的问题     在struts2中发现,调用action中的方法,方法会被执行两次,后来发现调用的方法是get开头的,把它改为其他名称开头的后,就不会执行 ...

  6. JavaScript 数据类型转换(显式与隐式)

    一.数据类型 JS中有5中简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String.还有一种复杂数据类型------Object,Object本质是 ...

  7. PhoneGap 在eclipse上开发Android程序

    本文将记录在Eclipes上开发Android App,在使用的方法是Hybrid App(混合模式移动应用), 由于本人的工作需要,将要开发在车间使用的数据录入程序,但是其中有非常多的逻辑验证和判断 ...

  8. 浅谈inline-block

    一.区分block,inline,inline-block 1.block block元素会独占一行,多个block元素会各自新起一行.默认情况下,block元素宽度自动填满其父元素宽度. block ...

  9. java判断字符串是否为空的方法总结

    http://blog.csdn.net/qq799499343/article/details/8492672 以下是java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观 ...

  10. NodeJS学习笔记—1.CommonJS规范

    由于现在web开发,越来越重视代码的复用和抽象的封装,为了解决代码的组织结构.管理.复用和部署等问题,现在普遍采用的机制是模块机制(module).CommonJS约定桌面应用程序和服务器应用程序需要 ...