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;
}