【PAT甲级】1126 Eulerian Path

简介: 【PAT甲级】1126 Eulerian Path

1126 Eulerian Path


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 Eulerian, Semi-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
• 1
• 2

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


题意


在图论中,欧拉路径是图中的一条路径,该路径满足恰好访问每个边一次。


而欧拉回路是一条在同一顶点处开始和结束的欧拉路径。


如果一个连通图的所有顶点的度数都为偶数,那么这个连通图具有欧拉回路,且这个图被称为欧拉图。


如果一个连通图中有两个顶点的度数为奇数,其他顶点的度数为偶数,那么所有欧拉路径都从其中一个度数为奇数的顶点开始,并在另一个度数为奇数的顶点结束。


具有欧拉路径但不具有欧拉回路的图被称为半欧拉图。


现在,给定一个无向图,请你判断它是欧拉图、半欧拉图还是非欧拉图。

思路


  1. 输入每条边,并记录每条边的度数。
  2. 通过 dfs 来计算一共经过了多少结点,从而判断该图是否为连通图。
  3. 输出该图中所有结点的度数。
  4. 判断该图是否为连通图,如果是连通图还要进一步计算度数为奇数的结点,然后再输出该图是什么图。


代码

#include<bits/stdc++.h>
using namespace std;
const int N = 510;
int n, m;
int d[N];
bool g[N][N], st[N];
//判断是否为连通图
int dfs(int u)
{
    st[u] = true; //标记该点
    int res = 1;  //计算经过了多少结点
    for (int i = 1; i <= n; i++)   //遍历临近结点
        if (!st[i] && g[u][i]) //判断该边是否存在
            res += dfs(i);
    return res;
}
int main()
{
    cin >> n >> m;
    //输入每条边
    for (int i = 0; i < m; i++)
    {
        int a, b;
        cin >> a >> b;
        g[a][b] = g[b][a] = true;
        d[a]++, d[b]++;  //更新度数
    }
    int cnt = dfs(1); //判断是否为连通图
    //输出每个点的度数
    cout << d[1];
    for (int i = 2; i <= n; i++)   cout << " " << d[i];
    cout << endl;
    //判断是否为欧拉回路
    if (cnt == n)
    {
        //计算度数为奇数的结点数量
        int s = 0;
        for (int i = 1; i <= n; i++)
            if (d[i] % 2)
                s++;
        if (s == 0)    puts("Eulerian");
        else if (s == 2)   puts("Semi-Eulerian");
        else puts("Non-Eulerian");
    }
    else    puts("Non-Eulerian");
    return 0;
}


目录
相关文章
|
8月前
|
JavaScript Java 测试技术
基于Java的江苏融汇房地产营销策划有限公司的宣传网站的设计与实现(源码+lw+部署文档+讲解等)
基于Java的江苏融汇房地产营销策划有限公司的宣传网站的设计与实现(源码+lw+部署文档+讲解等)
62 0
基于Java的江苏融汇房地产营销策划有限公司的宣传网站的设计与实现(源码+lw+部署文档+讲解等)
|
计算机视觉
Crack Slide | hb省建筑市场监管公共服务平台滑块分析(一个从开始就失败的案例,0.1星)
Crack Slide | hb省建筑市场监管公共服务平台滑块分析(一个从开始就失败的案例,0.1星)
115 0
|
网络协议 网络安全
【Sword系列】第七届全国残疾人职业技能大赛样题-网络安全-flag not found
pcapng文件是Packet Capture Next Generation的缩写,是一种新型的网络数据包捕获文件格式。
96 0
 【Sword系列】第七届全国残疾人职业技能大赛样题-网络安全-flag not found
|
存储 机器学习/深度学习 算法
【PAT甲级】1131 Subway Map
【PAT甲级】1131 Subway Map
49 0
|
前端开发
好客租房53-context的使用
好客租房53-context的使用
82 0
好客租房53-context的使用
|
安全 开发者
SegmentFault 黑客马拉松获“杭州十大品牌活动”称号
2015 年 12 月 17 日,由杭州市科技创新服务中心和创业社交微链联合主办的杭州创业服务年会在杭州文华大酒店举行,SegmentFault 联合创始人兼 CTO 祁宁应邀出席,就 SegmentFault 黑客马拉松品牌活动如何助推公司品牌做出分享。
179 0
SegmentFault 黑客马拉松获“杭州十大品牌活动”称号
|
Web App开发 监控 安全
SegmentFault 2014黑客马拉松 北京 作品demo
灵感来自通话《白雪公主》,穿越到今天的“魔镜”功能依旧是识别你是不是美女。将自己的照片上传,每天有三次机会问魔镜:魔镜魔镜,谁是世界上最美丽的女人。“魔镜”会用尽一切丧心病狂的手段告诉你,你是世界上最美的女人,如果,方圆三米内还不行,就拿“毒苹果”毒死美女吧。
190 0
SegmentFault 2014黑客马拉松 北京 作品demo
|
安全 程序员 C语言
SegmentFault 获 SAIF/IDG >>1024 万融资
2015 年 10 月 24 日,SegmentFault 宣布获得来自赛富亚洲基金(软银赛富)领投、上一轮投资方 IDG 资本跟投的 >>1024 万新一轮投资。 SegmentFault CEO 高阳表示:“ ‘>>’ 这个符号是 ‘远远大于’ 的意思,之所以用 ‘1024 万’ 这个数字,一是为了纪念这个特殊的时间,再者也是因为互联网行业内,往往夸大或者虚报融资额的现象,我们用更少于融资额的数字是想号召大家更多的关注到自己的产品和业务中,融资也仅是创业路上一个阶段性的里程碑,一起携手在国内创造更好的创业氛围和环境才最为重要。”
188 0
SegmentFault 获 SAIF/IDG >>1024 万融资
MCN品牌贝壳视频完成数千万元Pre—B轮融资
贝壳视频于2017年9月正式推出,专注于短视频头部IP孵化与升级。全网累计签约短视频创作者50余人,覆盖粉丝过亿人,月播放量逾15亿,是国内领先的MCN机构之一。
736 0
|
物联网
为什么要选择CS专业,助力未来IT人的报考指南
计算机类专业,大致包括计算机科学与技术,软件工程,信息安全,网络工程等。一直以来,计算机专业都以热门,高收入,高就业率等标签为人所称道。计算机如此火热的原因是什么?这个行业真的吃青春饭吗?什么样的人适合学计算机?在接下来的文段中,我们将为你揭晓答案。
4261 0