PAT_A1126#Eulerian Path

本文详细介绍了如何判断一个无向图是否为欧拉图、半欧拉图或非欧拉图,通过分析图中各顶点的度数和图的连通性来确定其是否符合欧拉路径的条件。提供了完整的C++代码实现,帮助读者理解并解决PAT_A1126题目中的欧拉路径问题。

Source:

PAT A1126 Eulerian Path (25 分)

Description:

In graph theory, an Eulerian path is a path in a graph which visits every edge exactly once. Similarly, an Eulerian circuit is an Eulerian path which starts and ends on the same vertex. They were first discussed by Leonhard Euler while solving the famous Seven Bridges of Konigsberg problem in 1736. It has been proven that connected graphs with all vertices of even degree have an Eulerian circuit, and such graphs are called Eulerian. If there are exactly two vertices of odd degree, all Eulerian paths start at one of them and end at the other. A graph that has an Eulerian path but not an Eulerian circuit is called semi-Eulerian. (Cited from https://en.wikipedia.org/wiki/Eulerian_path)

Given an undirected graph, you are supposed to tell if it is Eulerian, semi-Eulerian, or non-Eulerian.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 2 numbers N (≤ 500), and M, which are the total number of vertices, and the number of edges, respectively. Then M lines follow, each describes an edge by giving the two ends of the edge (the vertices are numbered from 1 to N).

Output Specification:

For each test case, first print in a line the degrees of the vertices in ascending order of their indices. Then in the next line print your conclusion about the graph -- either EulerianSemi-Eulerian, or Non-Eulerian. Note that all the numbers in the first line must be separated by exactly 1 space, and there must be no extra space at the beginning or the end of the line.

Sample Input 1:

7 12
5 7
1 2
1 3
2 3
2 4
3 4
5 2
7 6
6 3
4 5
6 4
5 6

Sample Output 1:

2 4 4 4 4 4 2
Eulerian

Sample Input 2:

6 10
1 2
1 3
2 3
2 4
3 4
5 2
6 3
4 5
6 4
5 6

Sample Output 2:

2 4 4 4 3 3
Semi-Eulerian

Sample Input 3:

5 8
1 2
2 5
5 4
4 1
1 3
3 2
3 4
5 3

Sample Output 3:

3 3 4 3 3
Non-Eulerian

Keys:

Attention:

  • 判断图的连通性与顶点度的奇偶性即可

Code:

 1 /*
 2 Data: 2019-06-01 19:33:52
 3 Problem: PAT_A1126#Eulerian Path
 4 AC: 56:58
 5 
 6 题目大意:
 7 欧拉路径可以访问图中所有的边且各边仅访问一次,欧拉回路是起点和终点相同的欧拉路径;
 8 已知各顶点均含有偶数条边的图可构成欧拉回路,该图称作欧拉图;
 9 若只有两个顶点含有奇数条边的图可构成欧拉路径,并且这两个结点作为欧拉路径的起点和终点;
10 含有欧拉路径但不含欧拉回路的图,称作半欧拉图
11 现在给定一个图,判断其是否为欧拉图
12 输入:
13 第一行给出,顶点数N<=500,边数M
14 接下来M行给出各边
15 输出:
16 第一行给出,各顶点边数
17 第二行给出,非欧拉图,半欧拉图,欧拉图
18 
19 基本思路:
20 先判断含有奇数边顶点的数目,
21 再判断图的连通性,
22 若含有无奇数边顶点,且连通图,则为欧拉图
23 若含有两条奇数边顶点,且图连通,则为半欧啦图
24 否则,为非欧拉图
25 */
26 
27 #include<cstdio>
28 #include<algorithm>
29 using namespace std;
30 const int M=510,INF=1e9;
31 int grap[M][M],vis[M],in[M],n,sum=0;
32 
33 void DFS(int v)
34 {
35     vis[v]=1;
36     sum++;
37     for(int u=1; u<=n; u++)
38         if(vis[u]==0 && grap[u][v]!=INF)
39             DFS(u);
40 }
41 
42 int main()
43 {
44 #ifdef    ONLINE_JUDGE
45 #else
46     freopen("Test.txt", "r", stdin);
47 #endif
48 
49     fill(in,in+M,0);
50     fill(vis,vis+M,0);
51     fill(grap[0],grap[0]+M*M,INF);
52     int m,v1,v2,cnt=0;
53     scanf("%d%d", &n,&m);
54     for(int i=0; i<m; i++)
55     {
56         scanf("%d%d", &v1,&v2);
57         grap[v1][v2]=1;
58         grap[v2][v1]=1;
59         in[v1]++;
60         in[v2]++;
61     }
62     for(int i=1; i<=n; i++){
63         printf("%d%c", in[i], i==n?'\n':' ');
64         if(in[i]%2==1)  cnt++;
65     }
66     DFS(1);
67     if(cnt==2 && sum==n)
68             printf("Semi-Eulerian\n");
69     else if(cnt==0 && sum==n)
70                 printf("Eulerian\n");
71     else        printf("Non-Eulerian\n");
72 
73 
74     return 0;
75 }

 

转载于:https://www.cnblogs.com/blue-lin/p/10960945.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值