zoj 1395 可行遍性问题

来源:互联网 发布:凸优化求解算法 编辑:程序博客网 时间:2024/06/08 06:49

题目连接: 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表示跳过这种数据不读。

0 0
原创粉丝点击