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");
}
}
随机推荐
- 【BZOJ1833】【ZJOI2010】数字计数 数位DP
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...
- Qt 学习之路:输入元素
前面的章节中,我们看到了作为输入元素的MouseArea,用于接收鼠标的输入.下面,我们再来介绍关于键盘输入的两个元素:TextInput和TextEdit. TextInput是单行的文本输入框,支 ...
- poj1066
很好的一道题.题意是,一个正方形围墙内有一些交错的内墙,内墙的端点都在正方形上,在正方形内部有一个点,求从正方形外到这个点的最少要走的门数,门只能是线段的中点. 思路很巧妙,因为从一个点到终点不可能“ ...
- Realm Configuration HOW-TO--官方
来源:https://secure.gettinglegaldone.com/docs/realm-howto.html Quick Start This document describes how ...
- OC-KVO简介
一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应 ...
- Session 原理
Session天天用,但是你真的理解了么? 今天遇到了这个问题,于是研究了一下.要解决这个问题,首先就要明白一些Session的机理.Session在服务器是以散列表形式存在的,我们都知道Sessio ...
- 记一次网站服务器迁移(my)
遇到的难题: 基本没有遇到太大的问题,因为服务器环境是配好的阿里云环境,最后再nginx的rewrite配置遇到了一点问题,最后也算解决. 收获小点: 1) vim替换命令: 利用 :s 命令可以实现 ...
- mysql - 初探
1,查询所有数据库名称: show databases; 2,查询所有表: use database_name; show tables; 3,查询表中的所有字段: desc table_name;
- 使用XLinq.XElement读取带Namespace(命名空间)的XML
简介 本文主要介绍通过XELemet去读取含有namespaces(xmlns)的XML,这也是偶然间发现这个问题的,一个群里的小伙伴突然问起这个,以此记录一下. 背景 一个XML文档可能包括来自多个 ...
- NgNice项目案例
技术构架: 服务端技术:NodeJS + Express4.x + Mongodb + Mongoose 前端技术: AngularJS1.2.x + Bootstrap3.x 源码:https:// ...