POJ 1386 Play on Words(欧拉路)

http://poj.org/problem?id=1386

题意:

给出多个单词,只有单词首字母与上一个单子的末尾字母相同时可以连接,判断所有字母是否可以全部连接在一起。

思路:

判断是否存在欧拉道路,每个单词只需要处理首字母和尾字母就可以了。

还有需要注意的就是需要判断图是否连通,我在这里用了并查集来判断。

有向图D存在欧拉道路的充要条件是:D为有向图,D的基图连通,并且所有顶点的出度与入度都相等;或者除两个顶点外,其余顶点的出度与入度都相等,而这两个顶点中一个顶点的出度与入度之差为1,另一个顶点的出度与入度之差为-1。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<sstream>
 6 #include<vector>
 7 #include<stack>
 8 #include<queue>
 9 #include<cmath>
10 #include<map>
11 #include<set>
12 using namespace std;
13 typedef long long ll;
14 typedef pair<int,int> pll;
15 const int INF = 0x3f3f3f3f;
16 const int maxn = 1000 + 5;
17
18 int n;
19 int in[30],out[30];
20 int g[30][30];
21 int p[30];
22 char str[maxn];
23
24 int Find(int x)
25 {
26     return x==p[x]?x:p[x]=Find(p[x]);
27 }
28
29 int main()
30 {
31     //freopen("in.txt","r",stdin);
32     int T;
33     scanf("%d",&T);
34     while(T--)
35     {
36         memset(g,0,sizeof(g));
37         memset(in,0,sizeof(in));
38         memset(out,0,sizeof(out));
39
40         for(int i=0;i<26;i++)  p[i]=i;
41         scanf("%d",&n);
42         getchar();
43         for(int i=0;i<n;i++)
44         {
45             scanf("%s",str);
46             int len=strlen(str);
47             int u=str[0]-‘a‘;
48             int v=str[len-1]-‘a‘;
49             g[u][v]=1;
50             out[u]++;
51             in[v]++;
52
53             int x=Find(u);
54             int y=Find(v);
55             if(x!=y)  p[x]=y;
56         }
57
58         int cnt=0;
59         for(int i=0;i<26;i++)
60         {
61             if((in[i]||out[i]) && p[i]==i)
62                 cnt++;
63         }
64         if(cnt>1)
65         {
66             puts("The door cannot be opened.");
67         }
68         else
69         {
70             int num1=0,num2=0, num3=0;
71             for(int i=0;i<26;i++)
72             {
73                 if(in[i]!=out[i])
74                 {
75                     if(in[i]-out[i]==1)  num1++;
76                     else if(in[i]-out[i]==-1)  num2++;
77                     else num3++;
78                 }
79             }
80             if(num3==0 && ((num1==0 && num2==0)||(num1==1 && num2==1)))
81                 puts("Ordering is possible.");
82             else puts("The door cannot be opened.");
83         }
84     }
85     return 0;
86 }
时间: 2024-08-08 01:39:59

POJ 1386 Play on Words(欧拉路)的相关文章

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

题目链接:http://poj.org/problem?id=1386 思路分析:该问题要求判断单词是否能连接成一条直线,转换为图论问题:将单词的首字母和尾字母看做一个点,每个单词描述了一条从首字母指向尾字母的有向边, 则则所有的单词构成了一个有向图,问题变为判断该有向图中是否存在一条欧拉路:有向图中存在欧拉路的两个充分必要条件为:该图是联通的并且所有的点的入度等于出度或者只存在两个点的入度与出度不等,一个点的入度=出度+1,另一个点的入度=出度-1: 代码如下: #include <cstdi

poj 1780 code(欧拉路)

/* 对于n为密码想要序列最短 那么 1234 2345 这两个一定挨着 就是说 前一个的后n-1位是后一个的前n-1位 假设n==3 我们用0-99作为点的编号建图 然后每个点连出去10条边 两个相邻点有n-1个是重复的 边的权值可用两个点计算 比如 12 23 权值为123 123 234 权值为1234 显然最后的序列是每个边记录一次 也就是跑欧拉路 对于记录下的边权 第一条输出前n-1为 上下的输出最后一位 这就是答案了 poj上没有special judge 要求字典序最小 这里建边时

Catenyms+欧拉回路/欧拉路+并查集+POJ

Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9617   Accepted: 2524 Description A catenym is a pair of words separated by a period such that the last letter of the first word is the same as the last letter of the second. For e

POJ 2513--Colored Sticks【字典树编号 &amp;&amp; 并查集判连通 &amp;&amp; 欧拉路】

Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 32351   Accepted: 8536 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a st

POJ 2337 欧拉路

Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11214   Accepted: 2908 Description A catenym is a pair of words separated by a period such that the last letter of the first word is the same as the last letter of the second. For

POJ 2513 Colored Sticks 欧拉路的判断+字典树

题目链接: poj2513 题意: 给定一捆木棍.每根木棍的每个端点涂有某种颜色.问:是否能将这些棍子首尾相连,排成 一条直线,且相邻两根棍子的连接处端点的颜色一样. 输入描述: 输入文件中包含若干行,每行为两个单词,用空格隔开,表示一根棍子两个端点的颜色.表 示颜色的单词由小写字母组成,长度不超过10 个字符.木棍的数目不超过250000. 输出描述: 如果木棍能按照题目的要求排成一条直线,输出"Possible",否则输出"Impossible". 解题思路:

POJ 2337 &amp;&amp; ZOJ 1919--Catenyms 【有向图 &amp;&amp; 欧拉路判断 &amp;&amp; 欧拉路径】

Catenyms Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10427   Accepted: 2726 Description A catenym is a pair of words separated by a period such that the last letter of the first word is the same as the last letter of the second. For

poj 1637 Sightseeing tour【最大流+欧拉路】

参考:https://www.cnblogs.com/kuangbin/p/3537525.html 这篇讲的挺好的 首先分清欧拉路和欧拉环: 欧拉路:图中经过每条边一次且仅一次的路径,要求只有两个点的出入度之差为奇数,这两个点即为欧拉路的起点和终点 欧拉环:图中经过每条边一次且仅一次的环,要求全部点的出入度之差为偶数 这道题中要判定的是欧拉路.首先看是否满足"只有两个点的出入度之差为奇数"这个条件,可以发现尽管有没有定向的边,但是出入的之差的奇偶是不变的:假设一条从i出发的边变向为到

欧拉路&amp;&amp;欧拉回路 概念及其练习

欧拉路: 如果给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,这条路称为欧拉路: 如果给定无孤立结点图G,若存在一条回路,经过图中每边一次且仅一次,那么该回路称为欧拉回路. 存在欧拉回路的图,称为欧拉图. 一. 对于无向图G,具有一条欧拉路,当且仅当G是连通的,且有零个或两个奇数度结点. 且有零个奇数度结点,存在欧拉回路:有两个奇数度结点,存在欧拉路. 判断无向图G是否连通,可以从任意结点出发,进行深度优先遍历,如果可以遍历到所有点,也可以用并查集,判断根节点的个数, 说明,图G连通

图论--欧拉路,欧拉回路(小结)

在题目中在慢慢细说概念 1.HDU - 3018 Ant Trip 题目大意:又N个村庄,M条道路,问需要走几次才能将所有的路遍历 解题思路:这题问的是有关欧拉路的判定 欧拉路就是每条边只能走一次,且要遍历所有的边,简单的说就是一笔画(图连通) 这道题是无向图的欧拉路,无向图的欧拉路的判定:所有点的度数都是偶数度,或者只有两个点的度是奇数度,且图要是连通图 知道欧拉路是什么后,这题就比较好做了,第一件事就是找到有几个连通块,然后再判断一下每个连通块需要几笔才能完成就好了 #include <cs