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 ...
随机推荐
- 【python】any()和all()
any(iterable) 版本:该函数适用于2.5以上版本,兼容python3版本. 说明:如果iterable的任一元素不为0.''.False,返回True. all(iterable) 说明: ...
- CodeForces - 417A(思维题)
Elimination Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit ...
- Android中如何让手机屏幕不待机
在Android中,申请WakeLock可以让你的进程持续执行即使手机进入睡眠模式,比较实用的是比如后台有网络功能,可以保证操作持续进行. 方法: 在操作之前加入 PowerManager pm = ...
- MFC中添加消息响应函数
转自:http://blog.csdn.net/eddy_liu/article/details/8474677 目前,用MFC设计的Windows应用程序几乎都采用文档/视图结构.这种程序框架与简单 ...
- 按键的使用方法(三)-------verilog
按键的使用方法三:一键三用: 点击.长击和双击. 代码: /********************************Copyright***************************** ...
- 蓝牙4.0——Android BLE开发官方文档翻译
ble4.0开发整理资料_百度文库 http://wenku.baidu.com/link?url=ZYix8_obOT37JUQyFv-t9Y0Sv7SPCIfmc5QwjW-aifxA8WJ4iW ...
- a个人经验总结
个人经验总结 js中事件有个 on前缀 比如 onclick onmousemove jq中事件省略 on 如 click mousemove html引入其他页面 <iframe src= ...
- struts2文件上传类型的过滤
转自:http://www.2cto.com/kf/201403/282787.html 第一种解决方案: 1.手动实现文件过滤: 判断上传的文件是否在允许的范围内定义该Action允许上传的文件类型 ...
- Android Touch事件传递机制解析
android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法: 1)public boolean dispatchTouchEvent(MotionEven ...
- (转载)数据库表设计-水电费缴费系统(oracle)
水电缴费管理系统数据表设计 SQL建表脚本: 1 --建表 2 --管理人员表 admin 3 create table admin( 4 admin_id varchar2(3) not null, ...