7-32 哥尼斯堡的“七桥问题” (25 分)
标签:欧拉回路 math opened justify color void 图的遍历 算法 ott
哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示。
可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707—1783)最终解决了这个问题,并由此创立了拓扑学。
这个问题如今可以描述为判断欧拉回路是否存在的问题。欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个无向图,问是否存在欧拉回路?
输入第一行给出两个正整数,分别是节点数N (1)和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。
若欧拉回路存在则输出1,否则输出0。
6 10
1 2
2 3
3 1
4 5
5 6
6 4
1 4
1 6
3 4
3 6
1
5 8
1 2
1 3
2 3
2 4
2 5
5 3
5 4
3 4
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 }
标签:欧拉回路 math opened justify color void 图的遍历 算法 ott
原文地址:https://www.cnblogs.com/57one/p/11649820.html