1643 - 欧拉回路
时间限制 : 1 秒
内存限制 : 32 MB
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
题目输入
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N <= 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。
题目输出
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
输入/输出样例
输入格式
3 3 2 3 1 2 1 3 3 2 1 2 2 3 0
输出格式
1 0
C语言解答
#include<stdio.h> int main() { int n,m,a[1000]={0},i,temp,b,c,count; while(scanf("%d %d",&n,&m)!=EOF&&n!=0) { temp=m;count=0; while(m--) { scanf("%d %d",&b,&c); a[b]++;a[c]++; } for(i=1;i<=temp*2;i++) { if(a[i]%2!=0){count=1;break;} } if(count==0)printf("1\n"); else printf("0\n"); for(i=0;i<n;i++) a[i]=0; } return 0; }
C++解答
#include <cstdio> #include <vector> #include <cstring> const int N = 1005; std::vector < int > v[N]; bool vis[N]; void dfs(int x) { vis[x] = true; for (std::vector < int >::iterator it = v[x].begin(); it != v[x].end(); ++it) if (!vis[*it]) dfs(*it); } int main() { int n, m; while (scanf("%d", &n) && n > 0) { scanf("%d", &m); for (int i = 0; i < N; ++i) v[i].clear(); while (m--) { int x, y; scanf("%d %d", &x, &y); v[x].push_back(y); v[y].push_back(x); } memset(vis, 0, sizeof(vis)); dfs(1); int ans = 1; for (int i = 1; i <= n; ++i) { if (v[i].size() % 2 == 1) ans = 0; if (!vis[i]) ans = 0; } printf("%d\n", ans); } return 0; }