码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1116

时间:2015-02-01 21:42:23      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

判断一些字符串能首尾相连连在一起

并查集求欧拉回路和通路

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.

 1 #include <iostream>
 2 #include <string.h>
 3 #include <stdio.h>
 4 using namespace std;
 5 const int N=26;
 6 int pre[N];
 7 int IN[N],OT[N],p[N];
 8 bool vis[N];
 9 char str[1005];
10 void Init()
11 {
12     memset(vis,0,sizeof(vis));
13     memset(IN,0,sizeof(IN));
14     memset(OT,0,sizeof(OT));
15     for(int i=0;i<N;i++)
16         pre[i]=i;
17 }
18 int Find(int x)
19 {
20     if(pre[x]!=x)
21         pre[x]=Find(pre[x]);
22     return pre[x];
23 }
24 void Union(int x,int y)
25 {
26     x=Find(x);
27     y=Find(y);
28     if(x==y) return;
29     pre[x]=y;
30 }
31 int main()
32 {
33     int T,n;
34     scanf("%d",&T);
35     while(T--)
36     {
37         Init();
38         scanf("%d",&n);
39         while(n--)
40         {
41             scanf("%s",str);
42             int len=strlen(str);
43             int x=str[0]-a;
44             int y=str[len-1]-a;
45             Union(x,y);
46             OT[x]++;
47             IN[y]++;        // 记录节点 a 和 b的入度和出度
48             vis[x]=vis[y]=1;    //标记节点 a 和 b的出现
49         }
50         int cnt=0;
51         for(int i=0;i<N;i++)
52         {
53             pre[i]=Find(i);     //找出每个节点的 BOSS
54             if(vis[i]&&pre[i]==i)
55                 cnt++;  // 统计最终 BOSS 即根节点的个数 。
56         }
57         if(cnt > 1)//图不连通
58         {
59             puts("The door cannot be opened.");
60             continue;
61         }
62         int k=0;
63         for(int i=0;i<N;i++)
64         {
65             if(vis[i]&&IN[i]!=OT[i])
66                 p[k++]=i; //统计入度和出度不相等的点的信息
67         }
68         if(k==0)    //欧拉回路,即环
69         {
70             puts("Ordering is possible.");
71             continue;
72         }
73         if(k==2&&((OT[p[0]]-IN[p[0]]==1&&IN[p[1]]-OT[p[1]]==1)||(OT[p[1]]-IN[p[1]]==1&&IN[p[0]]-OT[p[0]]==1))) //欧拉通路起点出度减入度等于1,终点入度减出度等于1。
74         {
75             puts("Ordering is possible.");
76             continue;
77         }
78         puts("The door cannot be opened.");
79     }
80     return 0;
81 }

 

hdu 1116

标签:

原文地址:http://www.cnblogs.com/cnblogs321114287/p/4266070.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!