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

Input

Input to this problem will consist of a (non-empty) series of up to 100 data sets. Each data set will be formatted according to the following description, and there will be no blank lines separating data sets.

A single data set has 3 components:

  1. Start line - A single line, "START M N", where M indicates the butler‘s starting room, and N indicates the number of rooms in the house (1 <= N <= 20).
  2. Room list - A series of N lines. Each line lists, for a single room, every open door that leads to a room of higher number. For example, if room 3 had open doors to rooms 1, 5, and 7, the line for room 3 would read "5 7". The first line in the list represents
    room 0. The second line represents room 1, and so on until the last line, which represents room (N - 1). It is possible for lines to be empty (in particular, the last line will always be empty since it is the highest numbered room). On each line, the adjacent
    rooms are always listed in ascending order. It is possible for rooms to be connected by multiple doors!
  3. End line - A single line, "END"

Following the final data set will be a single line, "ENDOFINPUT".

Note that there will be no more than 100 doors in any single data set.

Output

For each data set, there will be exactly one line of output. If it is possible for the butler (by following the rules in the introduction) to walk into his chambers and close the final open door behind him, print a line "YES X", where X is the number of doors
he closed. Otherwise, print "NO".

Sample Input

START 1 2
1

END
START 0 5
1 2 2 3 3 4 4

END
START 0 10
1 9
2
3
4
5
6
7
8
9

END
ENDOFINPUT

Sample Output

YES 1
NO
YES 10

Source

South Central USA 2002

[Submit]   [Go Back]   [Status]  
[Discuss]

题目意思:

有n个房间,房间之间通过门连接,知道门连接的房间情况,求从m号房间能否经过所有的门一次,并且回到0号门。

解题思路:

把房间看成节点,门看成边,由题意知是一个连通图,然后判断是否存在从m到0的欧拉通路。

统计各点的度数即可。

代码:

//#include<CSpreadSheet.h>

#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#include<cmath>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#define M 1000000007
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

#define Maxn 22

int nu[Maxn],n,m;
char temp[Maxn];

int main()
{
    //freopen("in.txt","r",stdin);
   //freopen("out.txt","w",stdout);
   while(scanf("%s",temp))
   {
       if(temp[3]=='O')
            break;
       scanf("%d%d",&m,&n);
       memset(nu,0,sizeof(nu));
       getchar();
       int ans=0;

       for(int i=0;i<n;i++)
       {
           int la=0;
           char c;
           while((c=getchar())!='\n')
           {
               if(c==' ')
               {
                   ans++;
                   nu[i]++;
                   nu[la]++;
                   la=0;
                   while((c=getchar())==' ');
                   if(c=='\n')
                        break;
                   la=c-'0';
               }
               else
                  la=la*10+c-'0';
           }
           if(la)
           {
               nu[i]++;
               nu[la]++;
               ans++;
           }
       }
       //printf("ans:%d :%d %d\n",ans,nu[0],nu[1]);
       //system("pause");

       int ocnt=0,a[3];
       for(int i=0;i<n;i++)
           if(nu[i]&1)
           {
               ocnt++;
               if(ocnt>2)
                    break;
               a[ocnt]=i;
           }

        gets(temp);
        if(ocnt>2||ocnt==1)
            printf("NO\n");
        else if(!ocnt)
        {
            if(!m)
                printf("YES %d\n",ans);
            else
                printf("NO\n");
        }
        else
        {
            if(a[1]>a[2])
                swap(a[1],a[2]);
            if(!a[1]&&a[2]==m)
                printf("YES %d\n",ans);
            else
                printf("NO\n");
        }

   }
    return 0;
}
时间: 2024-08-25 21:12:27

[欧拉回路] 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 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 最基础的欧拉回路问题

题目大意: 从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 2230 Watchcow

题目链接: http://poj.org/problem?id=2230 Watchcow Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6055   Accepted: 2610   Special Judge Description Bessie's been appointed the new watch-cow for the farm. Every night, it's her job to walk acr

[欧拉回路] poj 1386 Play on Words

题目链接: http://poj.org/problem?id=1386 Play on Words Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9685   Accepted: 3344 Description Some of the secret doors contain a very interesting word puzzle. The team of archaeologists has to solve