POJ 1386 Play on Words(欧拉图的判断)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 11838 | Accepted: 4048 |
Description
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
Output
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(欧拉图的判断)的更多相关文章
- POJ 1745 线性和差取余判断
POJ 1745 线性和差取余判断 题目大意:每个数都必须取到,相加或相减去,问所有的方案最后的得数中有没有一个方案可以整除k 这个题目的难点在于dp数组的安排上面 其实也就是手动模仿了一下 比如 一 ...
- POJ 1386 Play on Words(单词建图+欧拉通(回)路路判断)
题目链接:http://poj.org/problem?id=1386 题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词就可以相连,判断给出的n个单词是否能够一个接着一个全 ...
- POJ 1637 Sightseeing tour (SAP | Dinic 混合欧拉图的判断)
Sightseeing tour Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6448 Accepted: 2654 ...
- POJ 1386 判断欧拉回路
题意:要开启一扇门,n个单词是密码,n个单词中,如果一个单词的首字母和前一个单词的尾字母相同,并且每个单词都能这么连起来且只用一次,则门可以开启,否则不能开启,现给出单词,判断门是否可以开. 有向图欧 ...
- poj 1386 Play on Words 有向欧拉回路
题目链接:http://poj.org/problem?id=1386 Some of the secret doors contain a very interesting word puzzle. ...
- poj 1386 Play on Words(有向图欧拉路+并查集)
题目链接:http://poj.org/problem?id=1386 思路分析:该问题要求判断单词是否能连接成一条直线,转换为图论问题:将单词的首字母和尾字母看做一个点,每个单词描述了一条从首字母指 ...
- poj 1386 Play on Words门上的单词【欧拉回路&&并查集】
题目链接:http://poj.org/problem?id=1386 题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词就可以相连,判断给出的n个单词是否能够一个接着一个全 ...
- POJ 1386 Play on Words(欧拉路)
http://poj.org/problem?id=1386 题意: 给出多个单词,只有单词首字母与上一个单子的末尾字母相同时可以连接,判断所有字母是否可以全部连接在一起. 思路: 判断是否存在欧拉道 ...
- [POJ 1386] Play on Words
[题目链接] http://poj.org/problem?id=1386 [算法] 将每个单词的首字母向尾字母连一条有向边,判断欧拉路径是否存在,即可 [代码] #include <algor ...
随机推荐
- PHP---TP框架---添加数据-----有三种方式
添加数据 添加数据有三种方式: 第一种: <?php namespace Home\Controller;//这个文件的命名空间 use Think\Controller;//use使用哪一个而 ...
- 安装chocolatey
C:\> @powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.web ...
- XX管理系统案例
一.登录界面建立登录文件夹Login,在此目录下面建立如下文件:Index.htm:登录页面ValidateCode.cs:生成验证码ProcessVerification.ashx:处理验证码Com ...
- 队列——解密QQ号
队列——解密QQ号 --转自啊哈磊[坐在马桶上看算法]算法4:队列——解密QQ号 新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问QQ号,小哈当然不会直接告诉小哼啦,原因嘛你懂的 ...
- 利用github page搭建博客
为什么选择GitHub Pages? 很多人用 wordpress,你为什么要用 github pages 来搭建? 1.github pages有300M免费空间,资料自己管理,保存可靠: 2.学着 ...
- MVC学习笔记---MVC的处理管线
漫步ASP.NET MVC的处理管线 ASP.NET MVC从诞生到现在已经好几个年头了,这个框架提供一种全新的开发模式,更符合web开发本质.你可以很好的使用以及个性化和扩展这个框架,但这需要你 ...
- 2.Abstract Factory 抽象工厂(创建型模式)之简单工厂
简单工厂 1.只有一个工厂(具体的,没有抽象) 2.只生产一种产品(抽象的产品) 3.这种产品可以有多种具体产品类型(派生) 代码实现 class Program { static void Main ...
- hdu 1240:Asteroids!(三维BFS搜索)
Asteroids! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- php中base64_decode与base64_encode加密解密函数
php中base64_decode与base64_encode加密解密函数,实例分析了base64加密解密函数的具体用法,具有一定的实用价值,需要的朋友可以参考下 本文实例讲述了php中base64_ ...
- mysql错误:“ Every derived table must have its own alias”(每个派生出来的表都必须有一个自己的别名)
自我感悟: 由此可以延伸,我们得到一个结果集,可以通过as XXX的方式,把结果集给当作一张表来用,以实现子查询: 一般在多表查询时,会出现此错误. 因为,进行嵌套查询的时候子查询出来的的结果是作为一 ...