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.

这句话就表明了连通……问题是,中间关几个门让他无法通过,前后都有门没关怎么办……

比如:

START 0 5

1 1

4 4

END

这怎么关门…… POJ AC的程序完全过不了这组数据啊。

好吧,贴上POJ AC程序,再贴上→_→ 真正意义上正确的程序。

AC 代码:

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
using namespace std;
int n,m;
int in[21],out[21];
int door;
bool Euler()
{
    int s[21],cot=0;
    for(int i=0; i<n; i++)
    {
        if(in[i]&1)s[cot++]=i;
        if(out[i]!=in[i])return 0;
    }
    if(cot>2||cot==1)return 0;
    if(cot==0&&m==0)return 1;
    if(s[0]==0&&s[1]==m||s[0]==m&&s[1]==0)return 1;
    return 0;
}
int main()
{
    char str[100];
    while(scanf("%s",str)!=EOF)
    {
        if(strcmp(str,"ENDOFINPUT")==0)return 0;
        scanf("%d%d",&m,&n);
        gets(str);
        door=0;
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        for(int i=0; i<n; i++)
        {
            gets(str);
            int c=0;
            for(int j=0; j<=strlen(str); j++)
            {
                if(str[j]>='0'&&str[j]<='9')
                    c=c*10+str[j]-'0';
                else
                {
                    if(c==0)continue;
                    door++;
                    in[c]++,out[i]++;
                    out[c]++,in[i]++;
                    c=0;
                }
            }
        }
        while(gets(str),strcmp(str,"END"));
        bool flag=1;
        flag=Euler();
        if(flag)printf("YES %d\n",door);
        else puts("NO");
    }
}

“错误”代码:

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
using namespace std;
int g[21][21];
int n,m;
int in[21],out[21];
int ans;
bool vis[21];
bool Euler()
{
    for(int i=0; i<n; i++)
    {
        //printf("%d :%d %d\n",i,in[i],out[i]);
        if(out[i]!=in[i])return 0;
    }
    return 1;
}
void dfs(int i)
{
    int j;
    for(j=0; j<n; j++)
    {
        if(g[i][j]==0)continue;
        break;
    }
    if(j==n)return;
    g[i][j]--,g[j][i]--;
    vis[i]=vis[j]=1;
    ans++;
    //printf("%d->%d\n",i,j);
    dfs(j);
}
int main()
{
    char str[100];
    while(scanf("%s",str)!=EOF)
    {
        if(strcmp(str,"ENDOFINPUT")==0)return 0;
        scanf("%d%d",&m,&n);
        gets(str);
        memset(g,0,sizeof(g));
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        for(int i=0; i<n; i++)
        {
            gets(str);
            int c=0;
            for(int j=0; j<=strlen(str); j++)
            {
                if(str[j]>='0'&&str[j]<='9')
                    c=c*10+str[j]-'0';
                else
                {
                    if(c==0)continue;
                    g[i][c]++,in[c]++,out[i]++;
                    g[c][i]++,out[c]++,in[i]++;
                    c=0;
                }
            }
        }
        while(gets(str),strcmp(str,"END"));
        bool flag=1;
        flag=Euler();
        memset(vis,0,sizeof(vis));
        ans=0;
        dfs(m);
        for(int i=0; i<n; i++)
            if(!vis[i])flag=0;
        if(flag)printf("YES %d\n",ans);
        else puts("NO");
    }
}

POJ 1300 Door Man

时间: 2024-10-19 16:31:55

POJ 1300 Door Man的相关文章

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

题目链接 题意 : 庄园有很多房间,编号从0到n-1,能否找到一条路径经过所有开着的门,并且使得通过门之后就把门关上,关上的再也不打开,最后能回到编号为0的房间. 思路 : 这就是一个赤裸裸的判断欧拉通路的问题了,但实际上,就只有两种情况能够输出YES,以房间为顶点,连接房间之间的门为边构造图,这两种情况分别是存在欧拉回路和欧拉通路的情况:所有房间都是偶数个门并且起始房间就是0,所以可以回到0,存在欧拉回路:有两个房间的门是奇数个,其余都是偶数个,这种情况下,要求出发房间和0房间的门是奇数个,并

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

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 欧拉图

http://poj.org/problem?id=1300 要不是书上有翻译我估计要卡死,,,首先这是一个连通图,鬼知道是那句话表示出来的,终点必须是0,统计一下每个点的度数,如果是欧拉回路那么起点必须是0,因为起点等于终点. 如果是欧拉通路的话,起点必须不是0而且0的度数必须是奇数不然不满足欧拉图的定义. 还有就是输入很操蛋,用的stringstream. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring

POJ 1300 Door Man(欧拉通路)

题目描写叙述: 你是一座大庄园的管家. 庄园有非常多房间,编号为 0.1.2.3..... 你的主人是一个心不在 焉的人,常常沿着走廊任意地把房间的门打开.多年来,你掌握了一个诀窍:沿着一个通道,穿 过这些大房间,并把房门关上.你的问题是是否能找到一条路径经过全部开着门的房间.并使得: 1) 通过门后马上把门关上. 2) 关上了的门不再打开. 3) 后回到你自己的房间(房间 0),而且全部的门都已经关闭了. 在本题中.给定房间列表.及连通房间的.开着的门.并给定一个起始房间.推断是否存在 这种一

POJ 1300 最基础的欧拉回路问题

题目大意: 从0~n-1编号的房间,从一个起点开始最后到达0号房间,每经过一扇门就关上,问最后能否通过所有门且到达0号房间 我觉得这道题的输入输出格式是我第一次遇到,所以在sscanf上也看了很久 每一行对应当前门能到达的房间,下方如有重复不在输入,所以会有空行,这里的空行,和将字符串内的数字一个个代入需要好好斟酌 这里只有两种情况能成功 从 0号房间出发,经过一个欧拉回路到达0 从别的房间出发,一个欧拉通路到达0,2个端点的均为基度节点 代码: 1 #include <iostream> 2

POJ 1300 Door Man(判断能否构成欧拉图)

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

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