Play on Words UVA - 10129 (有向图欧拉路径)

Play on Words

UVA - 10129

题意:n个单词,问能否收尾相连形成一条链。

把单词首尾字母看做点,单词内部连一条边,问是否存在欧拉路径。

用并查集,当且仅当只有一个点的出度比入度大1一个点的入度比出度大1其它点出度和入度相等时存在欧拉路径。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<set>
 4 #include<iostream>
 5 #include<cctype>
 6 #include<string>
 7 #include<sstream>
 8 #include<algorithm>
 9 #include<map>
10 #define LL long long
11 using namespace std;
12 const int maxn=100010;
13 int in[30],out[30];
14 int f[30];
15 set<int> si;
16 void init()
17 {
18     for(int i=0;i<30;i++)
19     {
20         in[i]=0;
21         out[i]=0;
22         f[i]=i;
23     }
24 }
25
26 int gf(int x)
27 {
28     return x==f[x]?x:f[x]=gf(f[x]);
29 }
30
31 void uni(int a,int b)
32 {
33     int pa=gf(a);
34     int pb=gf(b);
35     f[pa]=pb;
36 }
37 string s;
38 int main()
39 {
40     int t;
41     scanf("%d",&t);
42     while(t--)
43     {
44         int ok=1;
45         si.clear();
46         init();
47         int n;
48         int a,b;
49         int ctin=0,ctout=0,ct=0;
50         scanf("%d",&n);
51         for(int i=0;i<n;i++)
52         {
53             cin>>s;
54             a=s[0]-‘a‘;
55             b=s[s.length()-1]-‘a‘;
56             si.insert(a);
57             si.insert(b);
58             in[a]++;
59             out[b]++;
60             if(gf(a)!=gf(b)) uni(a,b);
61         }
62         int u=gf(a);
63         for(set<int> ::iterator it=si.begin();it!=si.end();it++)
64         {
65             if(gf(*it)!=u) ct++;
66             if(ct>0) {ok=0;break;}
67             if(in[*it]-out[*it]==1) ctin++;
68             else if(in[*it]-out[*it]==-1) ctout++;
69             else if(in[*it]-out[*it]>1||in[*it]-out[*it]<-1) {ok=0;break;}
70             if(ctin>1||ctout>1) {ok=0;break;}
71         }
72
73         if(ok) puts("Ordering is possible.");
74         else puts("The door cannot be opened.");
75     }
76 }

时间: 2024-10-13 19:14:52

Play on Words UVA - 10129 (有向图欧拉路径)的相关文章

Play on Words UVA 10129 (有向图的欧拉路)

说说: 这道题的题意很简单,就是给你一些单词,问是否能形成一个句子,使前一个单词的最后一个字母等于后一个单词的第一个字母.本质上来说就是有向图的欧拉路问题,当然存在欧拉回路也是OK的.一开始的时候,我以为存在欧拉路只需判断两种情况:一,是存在欧拉回路,即每个节点的入度等于出度.二,存在欧拉路,有且仅有一个节点的入度比出度大一,一个节点的出度比入度大一.只要满足任意其中一种情况即可.事实上不是这样的,其实还需要判断该图是否连通.这自然而然就想到了并查集的思想.当出现两个节点的时候,将其中的一个节点

Play on Words UVA - 10129 欧拉路径

关于欧拉回路和欧拉路径 定义:欧拉回路:每条边恰好只走一次,并能回到出发点的路径欧拉路径:经过每一条边一次,但是不要求回到起始点 ①首先看欧拉回路存在性的判定: 一.无向图每个顶点的度数都是偶数,则存在欧拉回路. 二.有向图(所有边都是单向的)每个节顶点的入度都等于出度,则存在欧拉回路. ②.欧拉路径存在性的判定 一.无向图一个无向图存在欧拉路径,当且仅当   该图所有顶点的度数为偶数   或者  除了两个度数为奇数外其余的全是偶数. 二.有向图一个有向图存在欧拉路径,当且仅当  该图所有顶点的

poj 2337 之 有向图 欧拉路径输出

/* poj 2337 之 有向图 欧拉路径输出  每个单词看作一条有向边,顶点即为单词首尾字母,然后求欧拉路径即可. 1)为保证字典序,先对单词按字典序排序 2)深搜,输出单词序列 */ 1 #include <iostream> 2 #include <fstream> 3 #include <sstream> 4 #include <cstdlib> 5 #include <cstdio> 6 #include <cstddef>

uva 10129 Play on Words(欧拉路)

uva 10129 Play on Words Description Play on Words 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 impo

UVa 10129 (并查集 + 欧拉路径) Play on Words

题意: 有n个由小写字母的单词,要求判断是否存在某种排列是的相邻的两个单词,前一个单词末字母与后一个单词首字母相同. 分析: 将单词的两个字母看做节点,则一个单词可以看做一条有向边.那么题中所求的排列就等价于该有向图中是否存在欧拉路径. 在判断之前,首先要确定这个图是连通的,代码中用并查集来实现. 回顾一下存在欧拉路径的条件,全都是偶点或者有且仅有两个奇点.我们用deg来记录每个点的度,出度为1,入度为-1. 程序中判断存在欧拉路径的条件就是:deg全为0 或者 有两个不为0的,其中一个为1一个

UVa 10129 单词

题意:给定一些单词,单词的尾字母和另一单词的首字母相同,则可以串联,问是否可以将所有的单词串联.单词可重复出现,但每个单词只能用一次:即某单词重复几次,则可用几次. 思路:欧拉道路的应用.欧拉道路,即"一笔画",从图中一结点出发走一条道路,每条边恰好经过一次. 首先要判断图是连通的. 对于无向图,最多只有两个奇点(度数为奇数).且从一奇点出发,到另一奇点终止:若无奇点,则可从任意点出发,最终定会回到该点(欧拉回路). 对于有向图,最多只能有两个点的入度不等于出度,且必须其中一点的出度恰

Uva(10129)+Uva(10054)

这两道题都是和欧拉图的判定有关,一个是有向图,一个是无向图的欧拉图的判定还有一个是有向图= = 先看10129...我们把单词的首字母看做是入度,最后一个字符看做是初度,那么这道题就变成图中是否存在欧拉回路.判断有向图的条件是该图是连通图和最多最有两个点的出度不等于入度,其实那两个点就是起点和终点,而且必须是其中一个点的入度比出度恰好大1(作为终点),另一个点的出度比它的入度恰好大1(作为起点) 连通图的话我们用并查集来判断,如果该图是连通图的话,那么他们共用祖先= = #include<std

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

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

UVA 10129 Play on Words(欧拉道路)

题意:给你n个字符串,问你是否可以出现一条链,保证链中每个字符串的第一个元素与上一个字符串的最后一个元素相同,注意可能重复出现同一个字符串 题解:以每一个字符串第一个元素指向最后一个元素形成一个有向图,判断这个有向图是否可以形成欧拉路就好 注意可能有重边与自环,因此求欧拉路时判断的是是否使用完了所有的边,求起点时注意出度与入度的计算 欧拉道路是从一个点一笔画完整张图(欧拉回路保证回到起点),注意除了起点与终点以外所有的点出度入度相等 起点出度大入度1,终点相反(所有的点出入度相等也可以),根据这