哥尼斯堡的“七桥问题”(25 分)
哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示。
可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707—1783)最终解决了这个问题,并由此创立了拓扑学。
这个问题如今可以描述为判断欧拉回路是否存在的问题。欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个无向图,问是否存在欧拉回路?
输入格式:
输入第一行给出两个正整数,分别是节点数N (1≤N≤1000)和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。
输出格式:
若欧拉回路存在则输出1,否则输出0。
输入样例1:
6 10
1 2
2 3
3 1
4 5
5 6
6 4
1 4
1 6
3 4
3 6
输出样例1:
1
输入样例2:
5 8
1 2
1 3
2 3
2 4
2 5
5 3
5 4
3 4
输出样例2:
0
1 /*
2 5-32 哥尼斯堡的“七桥问题” (25分)
3 http://pta.patest.cn/pta/test/15/exam/4/question/859
4 并查集(用来判断是否连通) 和 一笔画(每个节点的度必须为偶数)
5 */
6 #include <cstdio>
7 #include <cstdlib>
8 #include <iostream>
9 #include <vector>
10 #include <queue>
11 #include <map>
12 #include <algorithm>
13 #include <set>
14 #include <string>
15
16 using namespace std;
17
18 #define N 1005
19
20 int n , m ;
21
22 int degree[N] ;
23 int fa[N] ;
24
25 int find(int x)
26 {
27 if(x == fa[x])
28 return x ;
29 return fa[x] = find(fa[x]);
30 }
31
32 void merg(int x, int y)
33 {
34 fa[find(y)] = find(x) ;
35 }
36
37 int main()
38 {
39 //freopen("in.txt","r",stdin);
40 //freopen("out.txt","w",stdout);
41 int i , u , v;
42 while( scanf("%d%d",&n,&m) != EOF)
43 {
44 for(i = 1 ; i<= n ; i++)
45 {
46 fa[i] = i ;
47 degree[i] = 0 ;
48 }
49 for(i = 0 ; i< m ; i++)
50 {
51 scanf("%d%d",&u,&v);
52 degree[u] ++;
53 degree[v] ++;
54 if(find(u) != find(v))
55 merg(u ,v);
56 }
57
58 bool flag1 = true;
59 for(i = 1 ;i <= n ; i++)
60 {
61 if(degree[i] % 2 != 0)
62 {
63 flag1 = false ;
64 break;
65 }
66 }
67 if(flag1)
68 {
69 set<int> faset ;
70 for(i = 1 ;i <= n ; i++)
71 {
72 faset.insert(find(i));
73 }
74 if((int)faset.size() == 1)
75 {
76 printf("1\n");
77 }else{
78 printf("0\n");
79 }
80 }else{
81 printf("0\n");
82 }
83 }
84 return 0 ;
85 }
- /*
- 5-32 哥尼斯堡的“七桥问题” (25分)
- http://pta.patest.cn/pta/test/15/exam/4/question/859
- 并查集(用来判断是否连通) 和 一笔画(每个节点的度必须为偶数)
- */
- #include <cstdio>
- #include <cstdlib>
- #include <iostream>
- #include <vector>
- #include <queue>
- #include <map>
- #include <algorithm>
- #include <set>
- #include <string>
- using namespace std;
- #define N 1005
- int n , m ;
- int degree[N] ;
- int fa[N] ;
- int find(int x)
- {
- if(x == fa[x])
- return x ;
- return fa[x] = find(fa[x]);
- }
- void merg(int x, int y)
- {
- fa[find(y)] = find(x) ;
- }
- int main()
- {
- //freopen("in.txt","r",stdin);
- //freopen("out.txt","w",stdout);
- int i , u , v;
- while( scanf("%d%d",&n,&m) != EOF)
- {
- for(i = 1 ; i<= n ; i++)
- {
- fa[i] = i ;
- degree[i] = 0 ;
- }
- for(i = 0 ; i< m ; i++)
- {
- scanf("%d%d",&u,&v);
- degree[u] ++;
- degree[v] ++;
- if(find(u) != find(v))
- merg(u ,v);
- }
- bool flag1 = true;
- for(i = 1 ;i <= n ; i++)
- {
- if(degree[i] % 2 != 0)
- {
- flag1 = false ;
- break;
- }
- }
- if(flag1)
- {
- set<int> faset ;
- for(i = 1 ;i <= n ; i++)
- {
- faset.insert(find(i));
- }
- if((int)faset.size() == 1)
- {
- printf("1\n");
- }else{
- printf("0\n");
- }
- }else{
- printf("0\n");
- }
- }
- return 0 ;
- }
来源:oschina
链接:https://my.oschina.net/u/4266471/blog/4053811