PTA数据结构与算法题目集(中文) 7-32

PTA数据结构与算法题目集(中文)  7-32

7-32 哥尼斯堡的“七桥问题” (25 分)
 

哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示。

可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707—1783)最终解决了这个问题,并由此创立了拓扑学。

这个问题如今可以描述为判断欧拉回路是否存在的问题。欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个无向图,问是否存在欧拉回路?

输入格式:

输入第一行给出两个正整数,分别是节点数N (1)和边数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 #define _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<malloc.h>
 5 
 6 typedef struct ENode* Edge;
 7 struct ENode
 8 {
 9     int V1, V2;
10 };
11 typedef struct GNode* Graph;
12 struct GNode
13 {
14     int G[1010][1010];
15     int Ne;
16     int Nv;
17 };
18 
19 int Degree[1010];
20 int Collected[1010];
21 int Flag = 1;
22 int IsEdge(int V1,int V2,Graph Gra)
23 {
24     return Gra->G[V1][V2];
25 }
26 void Insert(Graph Gra, Edge E)
27 {
28     Gra->G[E->V1][E->V2] = 1;
29     Gra->G[E->V2][E->V1] = 1;
30 }
31 Graph CreateGraph(int Nv)
32 {
33     Graph Gra = (Graph)malloc(sizeof(struct GNode));
34     Gra->Ne = 0;
35     Gra->Nv = Nv;
36     for (int i = 1; i <= Gra->Nv; i++)
37         for (int j = 1; j <= Gra->Nv; j++)
38             Gra->G[i][j] = 0;
39     return Gra;
40 }
41 
42 Graph BuildGraph()
43 {
44     int N, M;
45     scanf("%d%d", &N, &M);
46     Graph Gra = CreateGraph(N);
47     Edge E = (Edge)malloc(sizeof(struct ENode));
48     for (int i = 0; i < M; i++)
49     {
50         scanf("%d%d", &(E->V1), &(E->V2));
51         Degree[E->V1]++;
52         Degree[E->V2]++;
53         Insert(Gra, E);
54     }
55     return Gra;
56 }
57 
58 void DFS(Graph Gra,int V)
59 {
60     for(int i=1;i<=Gra->Nv;i++)
61         if (!Collected[i] && IsEdge(V, i, Gra))
62         {
63             Collected[i] = 1;
64             if (Degree[i] % 2 == 1)
65                 Flag = 0;
66             DFS(Gra, i);
67         }
68 }
69 int IsCollected(int Nv)
70 {
71     for (int i = 1; i <= Nv; i++)
72         if (!Collected[i])
73             return 0;
74     return 1;
75 }
76 int main()
77 {
78     Graph Gra = BuildGraph();
79     DFS(Gra, 1);
80     if (Flag && IsCollected(Gra->Nv))
81         printf("1");
82     else
83         printf("0");
84 }
View Code

猜你喜欢

转载自www.cnblogs.com/57one/p/11649820.html