HDU 1116 Play on Words(有向图的欧拉路)

系统 1843 0

题目链接

首先这个题,我以为是DFS。。。交上各种TLE ,RE,暴栈和超时啊。。。找了一下题解,发现是图论问题。。。唉。

又重新翻离散课本。。。定理:有向图的欧拉路连通且存在一个出度比入度大一的,存在一个入度比出度大一的,其他入度出度相等。有向图欧拉回路连通且入度出度都相等。

交上WA,然后查错,总以为是 判断是否是联通的时候做错了,其实是 忘记判断也是欧拉回路了。。。悲剧。。。代码  好烂。

      #include <stdio.h>
      
        

#include 
      
      <
      
        string
      
      .h>
      
        

#include 
      
      <stdlib.h>


      
        int
      
       p[
      
        27
      
      ][
      
        27
      
      ],z,n,o[
      
        27
      
      ],key[
      
        27
      
      
        ];


      
      
        int
      
       find(
      
        int
      
      
         x)

{

    
      
      
        int
      
      
         r,t;

    r 
      
      =
      
         x;

    
      
      
        while
      
      (x !=
      
         o[x])

    x 
      
      =
      
         o[x];

    
      
      
        while
      
      (r !=
      
         x)

    {

        t 
      
      =
      
         o[r];

        o[r] 
      
      =
      
         x;

        r 
      
      =
      
         t;

    }

    
      
      
        return
      
      
         x;

}


      
      
        void
      
       merge(
      
        int
      
       x,
      
        int
      
      
         y)

{

    x 
      
      =
      
         find(x);

    y 
      
      =
      
         find(y);

    
      
      
        if
      
      (x !=
      
         y)

    o[x] 
      
      =
      
         y;

}


      
      
        int
      
      
         main()

{

    
      
      
        int
      
      
         t,i,j,sum,start,end,len,sum1,sum2,k1,k2;

    
      
      
        char
      
       str[
      
        1001
      
      
        ];

    scanf(
      
      
        "
      
      
        %d%*c
      
      
        "
      
      ,&
      
        t);

    
      
      
        while
      
      (t--
      
        )

    {

        z 
      
      = 
      
        1
      
      ;k1 = k2 = 
      
        0
      
      
        ;

        memset(p,
      
      
        0
      
      ,
      
        sizeof
      
      
        (p));

        memset(key,
      
      
        0
      
      ,
      
        sizeof
      
      
        (key));

        
      
      
        for
      
      (i = 
      
        1
      
      ;i <= 
      
        26
      
      ;i ++
      
        )

        o[i] 
      
      =
      
         i;

        scanf(
      
      
        "
      
      
        %d%*c
      
      
        "
      
      ,&
      
        n);

        
      
      
        for
      
      (i = 
      
        1
      
      ;i <= n;i ++
      
        )

        {

            scanf(
      
      
        "
      
      
        %s
      
      
        "
      
      
        ,str);

            len 
      
      =
      
         strlen(str);

            start 
      
      = str[
      
        0
      
      ] - 
      
        '
      
      
        a
      
      
        '
      
      +
      
        1
      
      
        ;

            end 
      
      = str[len-
      
        1
      
      ] - 
      
        '
      
      
        a
      
      
        '
      
      +
      
        1
      
      
        ;

            key[start] 
      
      = key[end] = 
      
        1
      
      
        ;

            merge(start,end);

            p[start][end] 
      
      ++
      
        ;

        }

        
      
      
        for
      
      (i = 
      
        1
      
      ;i <= 
      
        26
      
      ;i ++
      
        )

        {

            
      
      
        if
      
      
        (key[i])

            
      
      
        break
      
      
        ;

        }

        sum 
      
      =
      
         find(i);

        
      
      
        for
      
      (j = i+
      
        1
      
      ;j <= 
      
        26
      
      ;j ++
      
        )

        {

            
      
      
        if
      
      (find(j) != sum &&
      
         key[j])

            
      
      
        break
      
      
        ;

        }

        
      
      
        if
      
      (j != 
      
        27
      
      
        )

        z 
      
      = 
      
        0
      
      
        ;

        
      
      
        for
      
      (i = 
      
        1
      
      ;i <= 
      
        26
      
      &&z;i ++
      
        )

        {

            sum1 
      
      = sum2 = 
      
        0
      
      
        ;

            
      
      
        for
      
      (j = 
      
        1
      
      ;j <= 
      
        26
      
      ;j ++
      
        )

            {

                sum1 
      
      +=
      
         p[i][j];

                sum2 
      
      +=
      
         p[j][i];

            }

            
      
      
        if
      
      (sum1 ==
      
         sum2)

            ;

            
      
      
        else
      
      
        if
      
      (sum1 == sum2+
      
        1
      
      
        )

            {

                k1
      
      ++
      
        ;

            }

            
      
      
        else
      
      
        if
      
      (sum1+
      
        1
      
       ==
      
         sum2)

            {

                k2 
      
      ++
      
        ;

            }

            
      
      
        else
      
      
        

            {

                z 
      
      = 
      
        0
      
      
        ;

                
      
      
        break
      
      
        ;

            }

        }

        
      
      
        if
      
      
        (z)

        {

            
      
      
        if
      
      (k1==
      
        1
      
      &&k2==
      
        1
      
      
        )

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

            
      
      
        else
      
      
        if
      
      (k1==
      
        0
      
      &&k2==
      
        0
      
      
        )

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

            
      
      
        else
      
      
        

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

        }

        
      
      
        else
      
      
        

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

    }

    
      
      
        return
      
      
        0
      
      
        ;

}
      
    

HDU 1116 Play on Words(有向图的欧拉路)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论