Play on Words
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 11838   Accepted: 4048

Description

Some of the secret doors contain a very interesting word puzzle. The team of archaeologists has to solve it to open that doors. Because there is no other way to open the doors, the puzzle is very important for us.

There is a large number of magnetic plates on every door. Every plate has one word written on it. The plates must be arranged into a sequence in such a way that every word begins with the same letter as the previous word ends. For example, the word ``acm'' can be followed by the word ``motorola''. Your task is to write a computer program that will read the list of words and determine whether it is possible to arrange all of the plates in a sequence (according to the given rule) and consequently to open the door.

Input

The input consists of T test cases. The number of them (T) is given on the first line of the input file. Each test case begins with a line containing a single integer number Nthat indicates the number of plates (1 <= N <= 100000). Then exactly Nlines follow, each containing a single word. Each word contains at least two and at most 1000 lowercase characters, that means only letters 'a' through 'z' will appear in the word. The same word may appear several times in the list.

Output

Your program has to determine whether it is possible to arrange all the plates in a sequence such that the first letter of each word is equal to the last letter of the previous word. All the plates from the list must be used, each exactly once. The words mentioned several times must be used that number of times. 
If there exists such an ordering of plates, your program should print the sentence "Ordering is possible.". Otherwise, output the sentence "The door cannot be opened.".

Sample Input

3
2
acm
ibm
3
acm
malform
mouse
2
ok
ok

Sample Output

The door cannot be opened.
Ordering is possible.
The door cannot be opened.

题目链接:POJ 1386

做法:把单词看成有向边,比如acm就是从a->m的一条边,但是字母肯定不能当节点啊,由于字母都是lowercase,那就都减掉'a'来映射到数字0~25就可以了(单词的长度其实在这个题里显然没什么卵用)然后进行欧拉图判断

对于是否是欧拉图的判断:首先基图要连通,然后再看入度和出度不相等的点的个数,若为0,则为欧拉图且有欧拉回路;如果为1,即只有一个点入度不等于其他点均相等,则出度不会等于入度,显然这在图里是不可能的,图的入度和一定会等于出度和;然后是两个点,看是否一个是入度比出度少1,一个是入度比出度多1……,忘记判断vector为空RE几次…………

代码:

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(x,y) memset(x,y,sizeof(x))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=100010;
const int L=1005;
char s[L];
struct edge
{
int to;
int pre;
};
edge E[N<<1];
int head[N],tot;
int cur[30],vis[30];
int ru[30],chu[30];
void init()
{
CLR(head,-1);
tot=0;
CLR(vis,0);
CLR(cur,0);
CLR(ru,0);
CLR(chu,0);
}
void add(int s,int t)
{
E[tot].to=t;
E[tot].pre=head[s];
head[s]=tot++;
}
bool bfs(int s,int all)
{
queue<int>Q;
vis[s]=1;
--all;
Q.push(s);
while (!Q.empty())
{
int now=Q.front();
Q.pop();
for (int i=head[now]; ~i; i=E[i].pre)
{
int v=E[i].to;
if(!vis[v])
{
vis[v]=1;
--all;
Q.push(v);
}
}
}
return !all;
}
int main(void)
{
int tcase,n,i,a,b,len;
scanf("%d",&tcase);
while (tcase--)
{
init();
scanf("%d",&n);
int P=0;
while (n--)
{
scanf("%s",s);
len=strlen(s);
a=s[0]-'a';
b=s[len-1]-'a';
if(!cur[a])
cur[a]=1,++P;
if(!cur[b])
cur[b]=1,++P;
add(a,b);
add(b,a);
++chu[a];
++ru[b];
}
int s=0;
for (i=0; i<26; ++i)
{
if(cur[i])
{
s=i;
break;
}
}
bool flag=bfs(s,P);
if(!flag)
puts("The door cannot be opened.");
else
{
vector<pii>pos;
for (i=0; i<26; ++i)
{
if((ru[i]==0&&chu[i]==0)||(ru[i]==chu[i]))
continue;
pos.push_back(pii(ru[i],chu[i]));
}
if(pos.empty())
flag=true;
else if(pos.size()>2)
flag=false;
else
{
if(pos[0].first==pos[0].second+1&&pos[1].first==pos[1].second-1)
flag=true;
else if(pos[1].first==pos[1].second+1&&pos[0].first==pos[0].second-1)
flag=true;
else
flag=false;
}
puts(flag?"Ordering is possible.":"The door cannot be opened.");
}
}
return 0;
}

POJ 1386 Play on Words(欧拉图的判断)的更多相关文章

  1. POJ 1745 线性和差取余判断

    POJ 1745 线性和差取余判断 题目大意:每个数都必须取到,相加或相减去,问所有的方案最后的得数中有没有一个方案可以整除k 这个题目的难点在于dp数组的安排上面 其实也就是手动模仿了一下 比如 一 ...

  2. POJ 1386 Play on Words(单词建图+欧拉通(回)路路判断)

    题目链接:http://poj.org/problem?id=1386 题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词就可以相连,判断给出的n个单词是否能够一个接着一个全 ...

  3. POJ 1637 Sightseeing tour (SAP | Dinic 混合欧拉图的判断)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6448   Accepted: 2654 ...

  4. POJ 1386 判断欧拉回路

    题意:要开启一扇门,n个单词是密码,n个单词中,如果一个单词的首字母和前一个单词的尾字母相同,并且每个单词都能这么连起来且只用一次,则门可以开启,否则不能开启,现给出单词,判断门是否可以开. 有向图欧 ...

  5. poj 1386 Play on Words 有向欧拉回路

    题目链接:http://poj.org/problem?id=1386 Some of the secret doors contain a very interesting word puzzle. ...

  6. poj 1386 Play on Words(有向图欧拉路+并查集)

    题目链接:http://poj.org/problem?id=1386 思路分析:该问题要求判断单词是否能连接成一条直线,转换为图论问题:将单词的首字母和尾字母看做一个点,每个单词描述了一条从首字母指 ...

  7. poj 1386 Play on Words门上的单词【欧拉回路&&并查集】

    题目链接:http://poj.org/problem?id=1386 题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词就可以相连,判断给出的n个单词是否能够一个接着一个全 ...

  8. POJ 1386 Play on Words(欧拉路)

    http://poj.org/problem?id=1386 题意: 给出多个单词,只有单词首字母与上一个单子的末尾字母相同时可以连接,判断所有字母是否可以全部连接在一起. 思路: 判断是否存在欧拉道 ...

  9. [POJ 1386] Play on Words

    [题目链接] http://poj.org/problem?id=1386 [算法] 将每个单词的首字母向尾字母连一条有向边,判断欧拉路径是否存在,即可 [代码] #include <algor ...

随机推荐

  1. Android之圆角矩形

    安卓圆角矩形的定义 在drawable文件夹下,定义corner.xml <?xml version="1.0" encoding="utf-8"?> ...

  2. redhat6.2下的ssh密钥免密码登录(原创)

    这个是我自己写的,鼓励转载,请说明转载地址:http://www.cnblogs.com/nucdy/p/5664840.html 在进行hadoop的免密码的登录操作是,老是发生no route等错 ...

  3. zsh(yum装包的时候,有时候会不行)

    [root@GIT ~]# yum search zsh =============================== N/S Matched: zsh ====================== ...

  4. javascript栈的建立样码

    早上参加小孩的一年级入学前,看看相关的东东啦.. function Stack() { var items = []; this.push = function(element){ items.pus ...

  5. Codeforces Round #360 (Div. 1) D. Dividing Kingdom II 并查集求奇偶元环

    D. Dividing Kingdom II   Long time ago, there was a great kingdom and it was being ruled by The Grea ...

  6. AppInventor学习笔记(五)——瓢虫快跑应用学习

    一.瓢虫引入 1:加入控件: 先引入方框中含有的控件,里面有两个画布,一个图像精灵,一个重力感应,一个时钟(设为10Ms).顺手改名.设置图像精灵的移动speed为10,并且引入瓢虫的图像 2.加入逻 ...

  7. web service介绍

    WEB SEVICE平台 web Service 三种基本元素: SOAP .WSDL .UDDI 什么是SOAP:       XML+HTTP 基本的Web Service平台 SOAP 简易对象 ...

  8. LCIS POJ 2172 Greatest Common Increasing Subsequence

    题目传送门 题意:LCIS(Longest Common Increasing Subsequence) 最长公共上升子序列 分析:a[i] != b[j]: dp[i][j] = dp[i-1][j ...

  9. 模拟 CSU 1562 Fun House

    题目传送门 /* 题意:光线从 '*' 发射,遇到 '/' 或 '\' 进行反射,最后射到墙上,将 'x' 变成 '&' 模拟:仔细读题,搞清楚要做什么,就是i,j的移动,直到撞到墙,模拟一下 ...

  10. 基于Extjs的web表单设计器 第四节——控件拖放

    接着上一节介绍控件拖放的设计. 通过前面的介绍知道,我们的区域类型的容器控件有三种:Card.Table.Mixed. Card 可以支持几乎所有的常用控件,包括:文本TextField.多文本Tex ...