hdu 1116(并查集+欧拉路判断)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1116

思路:先合并,然后判断根结点是否唯一,如果是,则在判断是否是欧拉路;否则,直接结束。

View Code
 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 using namespace std;

 5 const int MAXN=100000+10;

 6 int In[MAXN],Out[MAXN];

 7 int parent[MAXN];

 8 bool mark[MAXN];

 9 int n;

10 

11 

12 void Initiate(){

13     for(int i=0;i<n;i++){

14         parent[i]=-1;

15     }

16 }

17 

18 int Find(int x){

19     int s;

20     for(s=x;parent[s]>=0;s=parent[s]);

21     while(s!=x){

22         int tmp=parent[x];

23         parent[x]=s;

24         x=tmp;

25     }

26     return s;

27 }

28 

29 void Union(int R1,int R2){

30     int r1=Find(R1);

31     int r2=Find(R2);

32     if(r1!=r2){

33         parent[r1]=r2;

34     }

35 }

36 

37 int main(){

38     int _case;

39     scanf("%d",&_case);

40     while(_case--){

41         scanf("%d",&n);

42         Initiate();

43         memset(mark,false,sizeof(mark));

44         memset(In,0,sizeof(In));

45         memset(Out,0,sizeof(Out));

46         for(int i=0;i<n;i++){

47             char str[1010];

48             scanf("%s",str);

49             int x=str[0]-'a';

50             int y=str[strlen(str)-1]-'a';

51             Union(x,y);

52             mark[x]=mark[y]=true;

53             Out[x]++;

54             In[y]++;

55         }

56         int count=0;

57         for(int i=0;i<26;i++){

58             if(mark[i]&&parent[i]==-1){

59                 count++;

60             }

61         }

62         if(count>1){

63             printf("The door cannot be opened.\n");

64         }else {

65             int p[27];

66             int k=0;

67             for(int i=0;i<26;i++){

68                 if(mark[i]&&In[i]!=Out[i]){

69                     p[k++]=i;

70                 }

71             }

72             if(k==0){

73                 printf("Ordering is possible.\n");

74             }else {

75                 if(k==2&&abs(In[p[0]]-Out[p[0]])==1&&abs(In[p[1]]-Out[p[1]])==1){

76                     printf("Ordering is possible.\n");

77                 }else 

78                     printf("The door cannot be opened.\n");

79             }

80         }

81     }

82     return 0;

83 }

 

你可能感兴趣的:(HDU)