HDU 1116 && POJ 1386 Play on Words(欧拉路径)

按字母来建边,每个单词的首字母和尾字母加边。先判断是否连通,然后判断每个字母的入度和出度不能出现差的绝对值大于2,然后入度和出度差的绝对值为1的不能超过两个。就可以形成欧拉路径

代码如下:

#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL long long
#define pi acos(-1.0)
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
const double eqs=1e-9;
const int MAXN=100000+10;
char s[1100];
int in[30], out[30], bin[30], _hash[30], f[30], vis[30];
int find1(int x)
{
        return bin[x]==x?x:bin[x]=find1(bin[x]);
}
void join(int x, int y)
{
        int f1=find1(bin[x]);
        int f2=find1(bin[y]);
        if(f1!=f2){
                bin[f2]=f1;
        }
}
void init()
{
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        memset(_hash,0,sizeof(_hash));
        memset(vis,0,sizeof(vis));
        for(int i=0;i<25;i++){
                bin[i]=i;
        }
}
int main()
{
        int t, n, i, len, sum, cnt, x;
        scanf("%d",&t);
        while(t--){
                scanf("%d",&n);
                init();
                cnt=0;
                for(i=0;i<n;i++){
                        scanf("%s",s);
                        len=strlen(s);
                        in[s[len-1]-'a']++;
                        out[s[0]-'a']++;
                        join(s[0]-'a',s[len-1]-'a');
                        vis[s[0]-'a']=vis[s[len-1]-'a']=1;
                }
                for(i=0;i<25;i++){
                        if(!vis[i]) continue ;
                        x=find1(bin[i]);
                        if(!_hash[x]){
                                        _hash[x]=1;
                                        cnt++;
                                }
                }
                if(cnt>1) puts("The door cannot be opened.");
                else{
                        sum=0;
                        bool flag=0;
                        for(i=0;i<25;i++){
                                if(abs(in[i]-out[i])==1){
                                        sum++;
                                }
                                else if(abs(in[i]-out[i])>1){
                                flag=1;
                                }
                        }
                        if(sum>2||flag) puts("The door cannot be opened.");
                        else puts("Ordering is possible.");
                }
        }
        return 0;
}
时间: 2024-11-07 01:51:07

HDU 1116 && POJ 1386 Play on Words(欧拉路径)的相关文章

HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)

题目链接 题意 : 有很多门,每个门上有很多磁盘,每个盘上一个单词,必须重新排列磁盘使得每个单词的第一个字母与前一个单词的最后一个字母相同.给你一组单词问能不能排成上述形式. 思路 :把每个单词看成有首字母指向尾字母的有向边,每个字母看成一个点,题中要求等效于判断图中是否存在一条路径经过每一条一次且仅一次,就是有向欧拉通路.统计个顶点的出入度,如果每个点的出入度都相同,那就是欧拉回路,如果有两个奇数度,那就是欧拉通路,除此之外,都不能满足要求.还有别忘了判断是否连通,此时用到并查集,图中所有的边

HDU 1116 &amp;&amp;POJ 1386 Play on Words(欧拉回路)

Problem 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

poj 1386 欧拉路径

1 /* 2 题意:给出N个单词,一个单词的头字母和另一个单词的尾字母相同则可以相连,问这N个单词是否能完全相连成一行 3 4 题解:求欧拉路径 5 首先以每个单词的首字母和尾字母为点并且连边,然后用DFS求该图是否连通,然后根据点的入度和出度判断是否存在 6 欧拉路径或者欧拉回路(存在回路也是符合要求的) 7 */ 8 #include <cstdio> 9 #include <cstring> 10 11 int map[30][30]; 12 int in[30],out[3

poj 1386 Play on Words 有向图欧拉路径判断

题意: 给n个单词,问是否可以将他们排成一排,使得前一个单词的末字符和后一个单词的首字符相同. 分析: 把每个单词看成一条边,转化为有向图是否存在欧拉路径问题. 代码: //poj 1386 //sep9 #include <iostream> #include <vector> #include <algorithm> #include <map> #include <string> using namespace std; const int

HDU 1087 &amp;&amp; POJ 2533(DP,最长上升子序列).

~~~~ 两道题的意思差不多,HDU上是求最长上升子序列的和,而POJ上就的是其长度. 貌似还有用二分写的nlogn的算法,不过这俩题n^2就可以过嘛.. ~~~~ 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1087 http://poj.org/problem?id=2533 ~~~~ HDU1087: #include<cstdio> #include<cstring> #include<algorithm> #

Eight hdu 1043 poj 1077

Description The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've seen it. It is constructed with 15 sliding tiles, each with a number from 1 to 15 on it, and all packed into a 4 by 4 frame with one tile mis

hdu 2844 poj 1742 Coins

hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正好为时限3000ms....太慢了,hdu直接TLE(时限1s); 之 后发现其实并不是算法的问题,而是库函数的效率没有关注到.我是使用fill()按量初始化的,但是由于memset()可能是系统底层使用了四个字节拷 贝的函数(远比循环初始化快),效率要高得多..这就是为什么一直TLE的原因,fil

HDU 1829 &amp;&amp; POJ 2492 A Bug&#39;s Life(种类并查集)

题目地址:HDU 1829     POJ 2492 这个题可以用两种方法做,第一眼看完题是觉得用dfs染色判断二分图.然后又写的刚学的种类并查集.原来并查集可以这样用,真是神奇.. dfs染色代码: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #incl

hdu 1541/poj 2352:Stars(树状数组,经典题)

Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4052    Accepted Submission(s): 1592 Problem Description Astronomers often examine star maps where stars are represented by points on a plan