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 }
  • 相关阅读:
    scrapy下载图片第一波
    scrapy之防ban策略
    xml之dtd约束
    Java jdbc相关
    XSS获取cookie
    反射型XSS & DVWA
    MySQL数据库设计规范
    SQL Server 查询指定时间是一年当中的第几周
    js验证15位或18位身份证
    C# Process.Start()
  • 原文地址:https://www.cnblogs.com/huangxf/p/4265350.html
Copyright © 2011-2022 走看看