POJ 1003 判断欧拉回路

题意:有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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值