hdu1116

http://acm.hdu.edu.cn/showproblem.php?pid=1116

 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<string.h>
 4 #include<stdlib.h>
 5 #include<iostream>
 6 using namespace std;
 7 const int N=30;
 8 int father[N],vis[N];
 9 int find(int x)//查找根
10 {
11     if(father[x]!=x)
12     father[x]=find(father[x]);
13     return father[x];
14 }
15 void make(int a,int b)//合并操作
16 {
17     int f1=find(a);
18     int f2=find(b);
19     if(f1!=f2)
20     father[f1]=f2;
21 }
22
23 int main()
24 {
25     //freopen("in.txt","r",stdin);
26     int t;
27     cin>>t;
28     while(t--)
29     {
30         int out[N],in[N],p[N];
31         memset(in,0,sizeof(in));
32         memset(out,0,sizeof(out));
33         memset(vis,0,sizeof(vis));
34         int n;
35         for(int i=0;i<26;i++)
36         father[i]=i;//数组赋初值
37         cin >> n;
38         while(n--)
39         {
40             char str[1005];
41             cin>>str;
42             int a=str[0]-‘a‘;
43             int b=str[strlen(str)-1]-‘a‘;
44             out[a]++;
45             in[b]++;
46             make(a,b);//合并操作
47             vis[a]=vis[b]=1;
48         }
49         for(int i=0;i<26;i++)
50         father[i]=find(i);//寻找每个点的根节点
51         int cnt=0;
52         for(int i=0;i<26;i++)
53         {
54             if(vis[i] && father[i]==i)//确定有几颗树
55             cnt++;
56         }
57         if(cnt>1)
58         {
59             printf("The door cannot be opened.\n");
60             continue;
61         }
62         int j=0;
63         for(int i=0;i<26;i++)
64         {
65             if(vis[i] && out[i]!=in[i])//找起点和终点
66             p[j++]=i;
67         }
68         if(j==0)//环
69         {
70             printf("Ordering is possible.\n");
71             continue;
72         }
73         if(j==2 && ((out[p[0]]-in[p[0]]==1 && in[p[1]]-out[p[1]]==1 ) ||
74                     (in[p[0]]-out[p[0]]==1 && out[p[1]]-in[p[1]]==1 ) ) )
75         {//起点和终点的判断
76             printf("Ordering is possible.\n");
77             continue;
78         }
79         printf("The door cannot be opened.\n");
80     }
81     return 0;
82 }
时间: 2024-10-29 19:10:10

hdu1116的相关文章

HDU1116(欧拉回路+并查集)

先用并查集来判断图是否连通,然后再根据欧拉回路的出度和入度的性质来判断是否为欧拉回路. 关键是建边,我们可以把字符串看成是一条边,首字母为出发点,尾字母为目的点,建边. #include <stdio.h> #include <string.h> #include <string> #include <iostream> #include <algorithm> #include <vector> #include <math.

hdu1116 欧拉回路

1 //Accepted 248 KB 125 ms 2 //欧拉回路 3 //以26个字母为定点,一个单词为从首字母到末尾字母的一条边 4 //下面就是有向图判断欧拉回路 5 //连通+节点入度和==出度和 或者 存在一对节点一个入度比出度大1,一个小1 6 #include <cstdio> 7 #include <cstring> 8 #include <iostream> 9 #include <queue> 10 using namespace s

hdu1116敌兵布阵

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 单点更新,区间求和. 1 #include<cstdio> 2 #include<cstring> 3 const int m=50005; 4 #define lson l,m,rt<<1 5 #define rson m+1,r,rt<<1|1 6 7 int sum[m<<2]; 8 9 inline void pushplus(int

hdu1116 Play on Words--并查集&amp;网络流

原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=1116 一:原题内容 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

hdu1116&amp;&amp;poj1386

链接:点击打开链接 题意:给出一些单词看能否首位相接 代码: #include <iostream> #include <string.h> #include <algorithm> #include <stdio.h> using namespace std; int fa[1005],in[1005],out[1005],vis[1005],temp[1005]; char s[1005]; int found(int x){ //找根节点 if(x!=

并查集练习1

举头望明月,低头敲代码... 推荐学习地址:http://www.cnblogs.com/cyjb/p/UnionFindSets.html 简单: hdu1213 How Many Tables:新手必秒 1 #include<cstdio> 2 const int N=1001; 3 int f[N]; 4 void init(int n){ 5 for(int i=1;i<=n;++i) 6 f[i]=i; 7 } 8 int fin(int x){ 9 if(x!=f[x])f[