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

题目链接

题意 : 庄园有很多房间,编号从0到n-1,能否找到一条路径经过所有开着的门,并且使得通过门之后就把门关上,关上的再也不打开,最后能回到编号为0的房间。

思路 : 这就是一个赤裸裸的判断欧拉通路的问题了,但实际上,就只有两种情况能够输出YES,以房间为顶点,连接房间之间的门为边构造图,这两种情况分别是存在欧拉回路和欧拉通路的情况:所有房间都是偶数个门并且起始房间就是0,所以可以回到0,存在欧拉回路;有两个房间的门是奇数个,其余都是偶数个,这种情况下,要求出发房间和0房间的门是奇数个,并且其实房间不能是0,因为不存在0到0的欧拉回路,但是存在别的房间到0的欧拉通路。

 1 //POJ 1300
 2 #include <stdio.h>
 3 #include <string>
 4 #include <iostream>
 5 #include <string.h>
 6
 7 using namespace std ;
 8
 9 int M,N,door[20] ;
10 string sh ;
11 char sh1[789] ;
12 int main()
13 {
14     while(cin >> sh)
15     {
16         if(sh == "ENDOFINPUT")
17             break ;
18         cin >> M >> N ;
19         getchar() ;
20         int cnt = 0 ;
21         memset(door,0,sizeof(door)) ;
22         for(int i = 0 ; i < N ; i++)
23         {
24             gets(sh1) ;
25             int len = strlen(sh1) ;
26             for(int j = 0 ; j < len ; j++)
27             {
28                 if(sh1[j] != ‘ ‘)
29                 {
30                     int d = sh1[j]-‘0‘ ;
31                     cnt ++ ;
32                     door[i] ++ ;
33                     door[d] ++ ;
34                 }
35             }
36         }
37         cin >> sh ;
38         int odd = 0 ,even = 0 ;
39         for(int i = 0 ; i < N ; i++)
40         {
41             if(door[i] % 2) odd ++ ;
42             else even ++ ;
43         }
44         if(odd == 0 && M == 0)
45             cout<< "YES "<< cnt <<endl ;
46         else if(odd == 2 && M != 0)
47             cout << "YES "<<cnt <<endl ;
48         else cout<<"NO"<<endl ;
49     }
50     return 0 ;
51 }

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

时间: 2024-10-19 16:31:56

POJ 1300 Door Man(欧拉回路的判定)的相关文章

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 door

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

poj1386欧拉回路的判定

#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <stack> #include <queue> #include <vector> #include <map> #include <string> #include <ios

[欧拉回路] 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