题意:有N个房间,每个房间都有若干门通往相应编号的房间(这些开着的门都是由房子主人经过时打开的,所以说明这些房间一定是连通的。),问是否能从编号为M的房间出发,经过所有的房间把所有的门都关闭最后回到0号房间,同时关上的的门不能再被打开。
思路:因为各个房间一定是连通的,所以判断是否能够一圈走完所有的路,则以房间为点,门为边的图必定是欧拉回路(有限图G是一条道路(即可以一笔画成)的充分必要条件是G是连通的,且奇数顶点的个数等于0(回路)或2。)且若奇数点若为0,则必定管家的起始点也是0房间,最后才会回到0房间。 若奇数点个数为2,则说明终点一定为奇数点之一且为0房间,另一个奇数点一定是起始点。
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int main()
{
char temp[100];
int m,n;
int no[30],sum;
while(scanf("%s",temp)!=EOF)
{
if(!strcmp(temp,"ENDOFINPUT")) return 0;
memset(no,0,sizeof(no));
scanf("%d%d",&m,&n);
sum=0; getchar();
for(int i=0;i<n;i++)
{
gets(temp);
int t=strlen(temp);
for(int j=0;j<t;j++)
{
if(temp[j]!=' ')
{
no[i]++;
no[temp[j]-48]++;
sum++;
}
}
}scanf("%s",temp);
int a=0 ;
for(int i=0;i<n;i++)
{//cout<<"no["<<i<<"]= "<<no[i]<<endl;
if(no[i]%2!=0) {a++; }
if(a>2) break;
} //cout<<"a= "<<a<<endl;
if(a==0&&m==0) printf("YES %d\n",sum);
else if(a==2&&no[0]%2==1&&m!=0&&no[m]%2==1) printf("YES %d\n",sum);
else printf("NO\n");
}
return 0;
}