题目描述:-
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
输入:-
测试输入包含若干测试用例。每个测试用例的第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
1 #include <iostream>
2 #include <cstdio>
3 #include <cstdlib>
4 #include <cstring>
5 #include <cmath>
6 #include <cctype>
7 #include <vector>
8 #include <list>
9 #include <deque>
10 #include <stack>
11 #include <queue>
12 #include <map>
13 #include <set>
14 #include <string>
15 #include <algorithm>
16
17
18 using namespace std;
19
20
21 vector<int>vt[1000];
22
23 int d[1000];
24 int vis[1000];
25
26
27
28 int bfs(int v)
29 {
30 vis[v]=1;
31
32 queue<int>q;
33
34 q.push(v);
35 while(q.size())
36 {
37 int ans=q.front();
38 q.pop();
39
40 for(int i=0;i<vt[ans].size();i++)
41 {
42 if(vis[vt[ans][i]]==0)
43 {
44 vis[vt[ans][i]]=1;
45 q.push(vt[ans][i]);
46 }
47 }
48 }
49 return 0;
50 }
51
52
53
54 int main()
55 {
56
57 int n,m;
58 int i,j,k;
59
60 while(scanf("%d",&n)!=EOF)
61 {
62 if(n==0)
63 break;
64
65 scanf("%d",&m);
66
67 for(i=1;i<=n;i++)
68 {d[i]=0;vt[i].clear();}
69
70
71
72 for(i=0;i<m;i++)
73 {
74 int a,b;
75 scanf("%d%d",&a,&b);
76 vt[a].push_back(b);
77 vt[b].push_back(a);
78
79
80 d[a]++;
81 d[b]++;
82 }
83
84
85 for(i=1;i<=n;i++)
86 vis[i]=0;
87
88
89 bfs(1);
90
91 for(i=1;i<=n;i++)
92 if(vis[i]==0)
93 break;
94
95 if(i<=n)
96 {
97 printf("0");
98
99 }
100 else
101 {
102 for(i=1;i<=n;i++)
103 if(d[i]%2!=0)
104 break;
105
106 if(i<=n)
107 {
108 printf("0");
109 }
110 else
111 printf("1");
112 }
113
114 puts("");
115 }
116
117
118
119
120
121
122
123
124 return 0;
125 }
转载于:https://www.cnblogs.com/zjushuiping/archive/2012/05/30/2526837.html