zoj 1395 可行遍性问题

题目连接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1395
对于无向图的可行遍性问题。

  • 无向图G是仅有两个奇结点的连通图,且G的欧拉通路以此两个端点为端点。
  • G是无奇结点的连通图是,必有欧拉回路。
    这道题的难点在于数据处理。
    我是这样处理的
int readline(char s[])
{
    int i=0;
    for(i=0;(s[i]=getchar())!='\n'&&s[i]!=EOF;i++);
    s[i]=0;
    return i;
}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int readline(char s[])
{
    int i=0;
    for(i=0;(s[i]=getchar())!='\n'&&s[i]!=EOF;i++);
    s[i]=0;
    return i;
}
int main()
{
    //freopen("in.txt","r",stdin);
    char buf[200];
    int doors=0;
    int m,n;
    int door[25];
    while(readline(buf))
    {
        if(buf[0]=='S')
        {
            doors=0;
            sscanf(buf,"%*s%d%d",&m,&n);
            memset(door,0,sizeof(door));
            for(int i=0;i<n-1;i++)
            {
                readline(buf);
                int k=0;
                int b;
                while(sscanf(buf+k,"%d",&b)==1) //若从buf+k读取到了一个数据
                {
                    doors++;
                    //cout<<b;
                    door[i]++;
                    door[b]++;
                    while(buf[k]&&buf[k]==' '){
                        k++;
                    }
                    while(buf[k]&&buf[k]!=' ') {
                        k++;
                    }
                }
            }
            readline(buf);
            int odd=0;
            int even=0;
            for(int i=0;i<n;i++)
            {
                if(door[i]%2==0) even++;
                else odd++;
            }
            if(odd==0&&m==0) printf("YES %d\n",doors);
            else if(odd==2&&door[0]%2==1&&door[m]%2==1&&m!=0)
                printf("YES %d\n",doors);
            else
                printf("NO\n");
        }
        else if(!strcmp(buf,"ENDOFINPUT"))
            break;
    }
    return 0;
}

关于sscanf,我是第一次用。它能从一个字符串中读入与指定格式相符的数据。
%*s,%*d表示跳过这种数据不读。

你可能感兴趣的:(zoj 1395 可行遍性问题)