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\n");
64         else if (a==2)
65         {
66             if ((k==0 && k2==m)||(k==m && k2==0)) printf("YES %d\n",cnt);
67             else printf("NO\n");
68         }
69         else if (m==0) printf("YES %d\n",cnt);
70         else printf("NO\n");
71     }
72     return 0;
73 }
时间: 2024-10-03 13:40:13

poj 1300 Door Man 欧拉回路的相关文章

POJ 1300 Door Man(欧拉回路的判定)

题目链接 题意 : 庄园有很多房间,编号从0到n-1,能否找到一条路径经过所有开着的门,并且使得通过门之后就把门关上,关上的再也不打开,最后能回到编号为0的房间. 思路 : 这就是一个赤裸裸的判断欧拉通路的问题了,但实际上,就只有两种情况能够输出YES,以房间为顶点,连接房间之间的门为边构造图,这两种情况分别是存在欧拉回路和欧拉通路的情况:所有房间都是偶数个门并且起始房间就是0,所以可以回到0,存在欧拉回路:有两个房间的门是奇数个,其余都是偶数个,这种情况下,要求出发房间和0房间的门是奇数个,并

POJ 1300 Door Man

判断是否欧拉回路. 很蛋疼的一道题,加上DFS判所有点是否连通就无限WA.(并查集也可判) 直接定理就AC了.都不知道所有点是不是在一个 连通块里面. 然后他们说:Your master is a particularly absent-minded lout and continually leaves doors open throughout a particular floor of the house. 这句话就表明了连通--问题是,中间关几个门让他无法通过,前后都有门没关怎么办--

POJ - 1780 Code (欧拉回路+手写DFS)

Description KEY Inc., the leading company in security hardware, has developed a new kind of safe. To unlock it, you don't need a key but you are required to enter the correct n-digit code on a keypad (as if this were something new!). There are severa

[欧拉回路] poj 1300 Door Man

题目链接: http://poj.org/problem?id=1300 Door Man Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2137   Accepted: 857 Description You are a butler in a large mansion. This mansion has so many rooms that they are merely referred to by number

POJ 1300 最基础的欧拉回路问题

题目大意: 从0~n-1编号的房间,从一个起点开始最后到达0号房间,每经过一扇门就关上,问最后能否通过所有门且到达0号房间 我觉得这道题的输入输出格式是我第一次遇到,所以在sscanf上也看了很久 每一行对应当前门能到达的房间,下方如有重复不在输入,所以会有空行,这里的空行,和将字符串内的数字一个个代入需要好好斟酌 这里只有两种情况能成功 从 0号房间出发,经过一个欧拉回路到达0 从别的房间出发,一个欧拉通路到达0,2个端点的均为基度节点 代码: 1 #include <iostream> 2

POJ 1300 Door Man(欧拉回路_格式控制*)

Description 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 part

poj 1300 欧拉图

http://poj.org/problem?id=1300 要不是书上有翻译我估计要卡死,,,首先这是一个连通图,鬼知道是那句话表示出来的,终点必须是0,统计一下每个点的度数,如果是欧拉回路那么起点必须是0,因为起点等于终点. 如果是欧拉通路的话,起点必须不是0而且0的度数必须是奇数不然不满足欧拉图的定义. 还有就是输入很操蛋,用的stringstream. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring

POJ 1300.Door Man 欧拉通路

Door Man Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2596   Accepted: 1046 Description 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 mas

poj 2337 &amp;&amp; zoj 1919 欧拉回路+连通性判断

题目要求按字典序排列,而且可能有重边 所以一开始就将数组从大到小排列,那么我将字符串加入链表时就会令小的不断前移,大的被挤到后面 这里有一点问题就是我一开始使用的是qsort: int cmp(const void *s1 , const void *s2){    return strcmp((char*)s1 , (char*)s2)<0;} qsort(str , n , sizeof(str[0]) , cmp) poj一直wa,试了发zoj却过了,可能是编译器原因吧,然后将字符串放入了