Door Man POJ - 1300 (欧拉回路的简单应用)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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:

Always shut open doors behind you immediately after passing through
Never open a closed door
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:

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).
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!
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

题意:
身为一名管家,你需要从自己的房间出发,通过房间之间的通道,关上所有开着的门,最后回到自己房间,关上的门就不能再打开了;
先输入管家的房间和房间数,下面给出每个房间通向的开着得房间得编号,只表示房间号比它大的

题解:
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。
其特点是
有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。

无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。

判断欧拉回路是否存在的方法

有向图:图连通,所有的顶点出度=入度。

无向图:图连通,所有顶点都是偶数度。
对于这题
1:
如果所有的房间都有偶数个门(通往其他房间),那么有欧拉回路,可以从 0 号房间出发,回到 0 号房间。但是这种情况下,出发的房间必须为 0,因为要求回到 0 号房间。
2:
有两个房间的门数为奇数,其余的都是偶数,如果出发的房间和 0 号房间的门数都是奇数,那么也可以从出发的房间到达 0 号房间,并且满足题目要求。但是不能从房间 0 出发,必须从另一个门数为奇数的房间出发。
代码:

#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;
char s[30];
int m,n,map[1010];
int main()
{
    
    while(scanf("%s",s))
    {
		if(strcmp(s,"ENDOFINPUT")==0)
		break;
		int i,flag=0,sum=0;
        memset(map,0,sizeof(map));
        scanf("%d %d",&n,&m);
        char ch=getchar();
        for(i=0;i<m;i++)//这里控制输入要特别注意
        {
            ch=getchar();
            while(ch!='\n')
            {
                if(ch!=' ')
                {
                    map[i]++;
                    map[ch-'0']++;
                }
                ch=getchar();
            }
        }
        for(i=0;i<m;i++)
        {
            if(map[i]%2)//寻找通过门数为奇数的门
            flag++;
            sum+=map[i];
        }
        if((flag==0&&n==0)||(flag==2&&(map[0]%2)&&n))//分别对应题解的1和2
        printf("YES %d\n",sum/2);
        else
        printf("NO\n");
        scanf("%s",s);
    }
    return 0;
}
欧拉回路与哈密尔顿回路【图论中的经典问题及算法实现】 欧拉回路是指在一个图中经过每条边恰好一次,并且回到起点的闭合路径。如果图中存在这样的回路,则称图中存在欧拉回路。对于无向图,存在欧拉回路的充要条件是每个顶点的度数都是偶数,并且图是连通的。对于有向图,存在欧拉回路的条件是每个顶点的入度等于出度,并且图是强连通的。哈密尔顿回路是指在一个图中经过每个顶点恰好一次,并且回到起点的闭合路径。哈密尔顿回路欧拉回路不同,它要求遍历所有顶点,而不是所有边。对于哈密尔顿回路,存在性的问题比欧拉回路复杂得多,并且没有一个多项式时间的算法可以解决所有情况。 阅读详情

相关推荐

欧拉回路性质与应用探究欧拉回路性质与应用探究欧拉回路性质与应用探究

欧拉回路性质与应用探究欧拉回路性质与应用探究欧拉回路性质与应用探究

欧拉回路

时间复杂度分析 每一个顶点被访问一次每条边被访问两次O(|V|+|E|)O(|V|2) 对稠密图 |E|~|V|2O(|V|) 对稀疏图 |E|~|V|注意:爆栈问题欧拉路或欧拉回路问题, 就是有一条路径(回路)由所有边构成,且每边只用一次。也称为一笔画问题,即连续的一次画出图的所有边,经过每条边一次且仅一次。...

老徐的博客 476

POJ 1300 Door Man:无向图、欧拉定理、gets、sscanf

POJ 1300 Door Man:无向图、欧拉定理、gets、sscanf

[转] 欧拉路径和欧拉回路及其应用

概念转自https://blog.csdn.net/qq_34454069/article/details/77779300 欧拉路径:在一个图中,从i点出发,能将每个边遍历一次最终达到j点的一条路径 欧拉回路:i=j时的欧拉路径 无向图 欧拉回路:在无向图中,只要每个点的度数均为偶数,那么必定存在欧拉回路。因为每个点的度是偶数,意味着总有成对的入边和出边,则不会出现卡在一个节点的情况。 ...

林鸿清的blog 1624

DFS应用——寻找欧拉回路

【0】README0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 “DFS应用——寻找欧拉回路” 的idea 并用源代码加以实现 (源代码,我还没有找到一种有效的数据结构和DFS进行结合,往后会po出); 【1】欧拉回路1.1)欧拉回路定义:我们必须在图中找出一条路径, 使得该路径对图的每条边恰好访问一次。如果我们要解决“附加的问题”, 那么我们就必须找到一个圈, 该圈恰好

PacosonSWJTU的博客 1万+

欧拉图及其应用

提到欧拉图就要谈到哥尼斯堡七桥问题,最初有这样的一个问题的:18世纪中叶,东普鲁士哥尼斯堡城有一条贯穿全城的普雷格尔河,河中有两个岛,通过七座桥彼此相连,如下图所示问题是这样的:有人从四块陆地中的任意一块出发,按什么样的路线能做到每座桥只通过一次而最后返回原地。我们可以将整个问题抽象成下面的图进行解答:对于一个结点来说,每出一次节点,代表与结点相连的某一条边已经走过了即结点度数减1,与其相连的结点的度数也减1,如果上述哥尼斯堡有解的话,就应该存在这样一条回路从某个地点出发最后回到某个地点。

apprentice_eye的博客 2536

POJ1300 Door Man —— 欧拉回路(无向图)

题目链接:http://poj.org/problem?id=1300 Door Man Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2899   Accepted: 1176 Description You are a butler in

A man can be destroyed, but not defeated. 420

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

aodiyi6351的博客 120

POJ 1300 Door Man欧拉回路

题目链接题目描述:你是一座大庄园的管家。庄园有很多房间,编号为0、1、2、3,...。你的主人是一个心不在焉的人,经常沿着走廊随意地把房间的门打开。多年来,你掌握了一个诀窍:沿着一个通道,穿过这些大房间,并把房门关上。你的问题是能否找到一条路径经过所有开着门的房间,并使得:1) 通过门后立即把门关上;2) 关上了的门不再打开;3) 最后回到你自己的房间(房间0),并且所有的门都已经关闭了。在本题中...

小康的博客 274

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

POJ 1300 Door Man(欧拉回路判定) http://poj.org/problem?id=1300 题意:给你N个房间(图节点)以及房间之间的门(图的边),且给你初始的房间号M,问你从初始房间走,可不可以经过每个门仅1次,最后到达0号房间.且所有的门都被你走过1次? 分析:仔细一看,其实这个问题就是判定是否存在无向图的欧拉回路或通路的问题.本题要理清所有可能的情况,理清了之后就

code 1364

poj1300 Door Man(欧拉回路判定)

题意:给你N个房间以及房间之间的门,且给你初始的房间号M,问你从初始房间走,可不可以经过每个门仅1次,最后到达0号房间.且所有的门都被你走过1次? 思路:将房间当成顶点,门作为边,转化为判断无向图是否存在欧拉回路或者通路。          所有门都被走一遍,所以任何有门的房间都必须是在同一连通分量:即degree不为0的节点所属并查集唯一.(因为允许存在孤立的一点,房间)    

围巾的ACM博客 554

POJ-1300 Door Man

题目大意: 你是一座大庄园的管家,庄园有很多房间,编号从0-n。你需要从m个房间走回到0号房间,并且通过一些房间,在通过这些房间的时候立即把们关上,关上了的门也不能再打开,并且在你回到0号房间的时候,所有的门已经关闭了。问你是否存在这样的路; 解题思路: 这题是道很简单欧拉通路/欧拉回路判断 我们知道一个定理:无向图G存在欧拉通路的充要条件是:G为联通图,并且G仅有两个奇度数节点或者无奇

Wilbert的博客 488

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 lou

AK_HuangYC的博客 637

POJ1300 Door Man 欧拉回路的判断

题目链接: 1300 题意: 一个房子中有(编号0~N-1)N个房间和X个连通两个房间的门,每次经过一扇门时这扇门会被关闭。问:一个人从M号房间出发能否成功到达0号房间并关闭所有门。 题解: 此题是欧拉回路的入门题,首先学习无向图欧拉回路的判断定理: 无向图G 存在欧拉通路的充要条件是:G 为连通图,并且G 仅有两个奇度结点(度数为奇数的

旧时光 1348

[POJ1300]Door Man 做题笔记

题目链接:http://poj.org/problem?id=1300 这题是比较裸的欧拉回路欧拉通路的判定公式的应用,但这题最可怕的应该是它的读入。。。 Hint:欧拉回路/欧拉通路要求基图联通,意思是不存在孤立的点,而不是整个图只有一个联通块。#include <cstdio> #include <cstring> #include <algorithm> using namespace

mhlwsk的博客 586

poj1300 door man

Problem A Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other) Total Submission(s) : 8   Accepted Submission(s) : 5 Problem Description You are a butler in a large man

wust_towave的专栏 462

poj1300 Door Man欧拉回路

Door Man Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2449   Accepted: 983 Description You are a butler in a large mansion. This mansion has so many rooms

苏苏爱自由 2073
上一篇: 第三周上动态规划(跑跑卡丁车 HDU - 1494 )
下一篇: 线段树单点修改区间查询
JSASL
博客等级 码龄7年 12粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值