950
京东网上商城
九度题目1027:欧拉回路
题目1027:欧拉回路时间限制:1 秒内存限制:32 兆特殊判题:否提交:2344解决:1157
题目描述:
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
输入:
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。
输出:
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
样例输入:
3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
样例输出:
1
0
来源:
2008年浙江大学计算机及软件工程研究生机试真题
典型的欧拉回路
AC代码:
#include<stdio.h> #include<string.h> struct node//创建一个路径计数结构体 { int len; int path[1200]; }a[1200]; int jar[1200]; void DFS(int n) { int last; while(a[n].len!=0)//深入搜索 a[n]每一个能连接的点 { last=a[n].path[a[n].len-1];//传回最后一个数据 jar[last]=1;//标记此路径已经被联通 a[n].len--;//删除最后一个数据 DFS(last);//跳向下一个点进行搜索 } } int main() { int i,j,n,m,x,y,num,size,flag; while(scanf("%d",&n),n!=0) { scanf("%d",&m); memset(a,0,sizeof(a)); for(i=0;i<m;i++) { scanf("%d %d",&x,&y); a[x].path[a[x].len++]=y;//a[x]末尾添加y a[y].path[a[y].len++]=x;//a[y]末尾添加x } num=0; for(i=1;i<=n;i++) { size=a[i].len; if(size%2!=0)//检查每一个点相对于其它点的连通性 num++; } memset(jar,0,sizeof(jar)); jar[1]=1;//先标记第一个点直接能通过 DFS(1); flag=1; for(i=1;i<=n;i++)//存在点一个点,其与任意一点都不相连 if(jar[i]==0) { flag=0; break; } if(num!=0) flag=0;//等于0时是完全环,符合一笔画,否则不是 if(flag==1) printf("1\n"); else printf("0\n"); } return 0; }
最后更新:2017-04-03 12:56:39