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