博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PAT甲级——A1126 Eulerian Path【30】
阅读量:4541 次
发布时间:2019-06-08

本文共 2993 字,大约阅读时间需要 9 分钟。

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 )

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 125 71 21 32 32 43 45 27 66 34 56 45 6

Sample Output 1:

2 4 4 4 4 4 2Eulerian

Sample Input 2:

6 101 21 32 32 43 45 26 34 56 45 6

Sample Output 2:

2 4 4 4 3 3Semi-Eulerian

Sample Input 3:

5 81 22 55 44 11 33 23 45 3

Sample Output 3:

3 3 4 3 3Non-Eulerian
题⽬⼤意:如果⼀个连通图的所有结点的度都是偶数,那么它就是Eulerian,如果除了两个结点的度是
奇数其他都是偶数,那么它就是Semi-Eulerian,否则就是Non-Eulerian~
分析:⽤邻接表存储图,判断每个结点的度【也就是每个结点i的v[i].size()】是多少即可得到最终结果
~注意:图必须是连通图,所以要⽤⼀个深搜判断⼀下连通性,从结点1开始深搜,如果最后发现统计
的连通结点个数cnt != n说明是不是连通图,要输出Non-Eulerian~
1 #include 
2 using namespace std; 3 int path[505] = { 0 }, graph[505][505]; 4 int n, m, a, b, odd = 0, num = 0; 5 bool visit[505] = { false }; 6 void DFS(int s) 7 { 8 visit[s] = true; 9 num++;10 for (int i = 1; i <= n; ++i)11 if (graph[s][i] == 1 && visit[i] == false) 12 DFS(i);13 }14 int main()15 { 16 cin >> n >> m; 17 while (m--)18 {19 cin >> a >> b;20 path[a]++;21 path[b]++;22 graph[a][b] = graph[b][a] = 1;23 }24 for (int i = 1; i <= n; ++i)25 {26 if (path[i] % 2 == 1)27 odd++;28 cout << (i == 1 ? "" : " ") << path[i];29 }30 DFS(1);//判断是不是连通图31 if (num == n && odd == 0)32 cout << endl << "Eulerian" << endl;33 else if (num == n && odd == 2)34 cout << endl << "Semi-Eulerian" << endl;35 else36 cout << endl << "Non-Eulerian" << endl;37 return 0;38 }

 

转载于:https://www.cnblogs.com/zzw1024/p/11478256.html

你可能感兴趣的文章
c++ UDP套接字客服端代码示范
查看>>
python中的关键字---1(基础数据类)
查看>>
《windows程序设计》文本输出(03)
查看>>
虚拟机、容器与Docker
查看>>
波兰表达式
查看>>
总结一下几个for循环常见用法和区别
查看>>
LNMP安装目录及配置文件位置
查看>>
out 传值
查看>>
8. 负载均衡算法
查看>>
python把函数作为参数的函数
查看>>
《C++ Primer》之指向函数的指针
查看>>
Java自学笔记(第五天)面向对象--char[]和String--封装--构造函数--this
查看>>
8.6 每日课后作业之递归调用番外篇(迭代器)
查看>>
CodeForces 55D Beautiful numbers(数位dp+数学)
查看>>
PAT甲级——A1048 Find Coins
查看>>
PAT甲级——A1049 Counting Ones
查看>>
PAT甲级——A1050 String Subtraction
查看>>
PAT甲级——A1021 Deepest Root
查看>>
PAT甲级——A1051 Pop Sequence
查看>>
PAT甲级——A1022 Digital Library
查看>>