• 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 }
  • 相关阅读:
    C++语法小记---string类
    C++语法小记---标准库
    C++语法小记---运算符重载
    C++语法小记---函数重载
    C++语法小记---友元
    C++语法小记---开篇
    STM32使用printf丢失第一个字母的问题
    AD芯片的基准参考电压问题
    运算放大器的调试经验
    [置顶] TIM_GetCounter与TIM_GetCapture1的区别
  • 原文地址:https://www.cnblogs.com/wally/p/3026992.html
Copyright © 2020-2023  润新知