zoukankan      html  css  js  c++  java
  • poj 1300 Door Man 欧拉回路

    题目链接:http://poj.org/problem?id=1300

    You are a butler in a large mansion. This mansion has so many rooms that they are merely referred to by number (room 0, 1, 2, 3, etc...). Your master is a particularly absent-minded lout and continually leaves doors open throughout a particular floor of the house. Over the years, you have mastered the art of traveling in a single path through the sloppy rooms and closing the doors behind you. Your biggest problem is determining whether it is possible to find a path through the sloppy rooms where you: 

    1. Always shut open doors behind you immediately after passing through 
    2. Never open a closed door 
    3. End up in your chambers (room 0) with all doors closed 


    In this problem, you are given a list of rooms and open doors between them (along with a starting room). It is not needed to determine a route, only if one is possible. 

    题意:给出一些房间和房间上的门以及房间之间的路径,如果你沿着这条路走到另一个房间,那么就得关掉这条路上的门,关掉的门不能再打开,问能不能从0号房间,在关掉所有门之后刚好走到房间m。

    解法:欧拉回路的判断。

    无向图的欧拉回路:连通无向图中没有度数为奇数个的节点或者有且仅有两个奇数个节点(此时这两个节点必须一个为起点,另一个为终点)。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<cmath>
     6 #include<algorithm>
     7 #define inf 0x7fffffff
     8 using namespace std;
     9 const int maxn=22;
    10 
    11 int m,n,degree[maxn];
    12 char str[maxn],s[maxn];
    13 
    14 int main()
    15 {
    16     while (scanf("%s",str)!=EOF)
    17     {
    18         if (strcmp(str,"ENDOFINPUT")==0) break;
    19         scanf("%d%d",&m,&n);
    20         int a;
    21         memset(degree,0,sizeof(degree));
    22         memset(s,0,sizeof(s));
    23         int cnt=0;
    24         getchar();
    25         for (int i=0 ;i<n ;i++)
    26         {
    27             gets(s);
    28             int len=strlen(s);
    29             if (len==0) continue;
    30             a=0;
    31             int q=0;
    32             for (q=0 ;q<len ;q++) if (s[q]!=' ') break;
    33             for (int j=q ;j<len ;j++)
    34             {
    35                 if (s[j]==' ')
    36                 {
    37                     degree[i] ++ ;
    38                     degree[a] ++ ;
    39                     cnt ++ ;
    40                     a=0;continue;
    41                 }
    42                 a=a*10+s[j]-'0';
    43                 if (j==len-1)
    44                 {
    45                     degree[i] ++ ;
    46                     degree[a] ++ ;
    47                     cnt ++ ;
    48                 }
    49             }
    50         }
    51         scanf("%s",str);
    52         a=0;
    53         int k=-1,k2=-1;
    54         for (int i=0 ;i<n ;i++)
    55         {
    56             if (degree[i]%2)
    57             {
    58                 a++;
    59                 if (k==-1) k=i;
    60                 else k2=i;
    61             }
    62         }
    63         if (a>2 || a==1) printf("NO
    ");
    64         else if (a==2)
    65         {
    66             if ((k==0 && k2==m)||(k==m && k2==0)) printf("YES %d
    ",cnt);
    67             else printf("NO
    ");
    68         }
    69         else if (m==0) printf("YES %d
    ",cnt);
    70         else printf("NO
    ");
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    C语言-if语句
    C语言-表达式
    C语言-基础
    Java for LeetCode 187 Repeated DNA Sequences
    Java for LeetCode 179 Largest Number
    Java for LeetCode 174 Dungeon Game
    Java for LeetCode 173 Binary Search Tree Iterator
    Java for LeetCode 172 Factorial Trailing Zeroes
    Java for LeetCode 171 Excel Sheet Column Number
    Java for LeetCode 169 Majority Element
  • 原文地址:https://www.cnblogs.com/huangxf/p/4265350.html
Copyright © 2011-2022 走看看