• PAT甲级——1126 Eulerian Path


    我是先在CSDN上发布的这篇文章:https://blog.csdn.net/weixin_44385565/article/details/89155050

    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 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

    题目大意:判断所给的无向图是否为欧拉图;

    欧拉图的相关性质:(来源百度百科~)

    1.无向连通图 G 是欧拉图,当且仅当 G 不含奇数度结点( G 的所有结点度数为偶数);

    2.无向连通图G 含有欧拉通路,当且仅当 G 有零个或两个奇数度的结点;

    3.有向连通图 D 是欧拉图,当且仅当该图为连通图且 D 中每个结点的入度=出度;

    4.有向连通图 D 含有欧拉通路,当且仅当该图为连通图且 D 中除两个结点外,其余每个结点的入度=出度,且此两点满足 deg-(u)-deg+(v)=±1 。(起始点s的入度=出度-1,结束点t的出度=入度-1 或两个点的入度=出度);

    5.一个非平凡连通图是欧拉图当且仅当它的每条边属于奇数个环;

    6.如果图G是欧拉图且 H = G-uv,则 H 有奇数个 u,v-迹仅在最后访问 v ;同时,在这一序列的 u,v-迹中,不是路径的迹的条数是偶数。

    思路:邻接表存图,一次深搜判断是否为连通图(定义全局变量flag,每访问一个节点就+1,DFS之后flag与节点的个数相同则为连通图);统计节点的度进而判断是否为欧拉图。

     1 #include <iostream>
     2 #include<vector>
     3 using namespace std;
     4 
     5 vector<int> G[501], Degree;
     6 vector<bool> Visit;
     7 void DFS(int vertex);
     8 int flag = 0;
     9 int main()
    10 {
    11     int N, M, even = 0, odd = 0;
    12     scanf("%d%d", &N, &M);
    13     Degree.resize(N + 1, 0);
    14     Visit.resize(N + 1, false);
    15     for (int i = 1; i <= M; i++) {
    16         int u, v;
    17         scanf("%d%d", &u, &v);
    18         G[u].push_back(v);
    19         G[v].push_back(u);
    20         Degree[u]++;
    21         Degree[v]++;
    22     }
    23     DFS(1);
    24     for (int i = 1; i <= N; i++) {
    25         if (Degree[i] % 2 == 0)
    26             even++;
    27         else
    28             odd++;
    29         printf("%d", Degree[i]);
    30         if (i < N)
    31             printf(" ");
    32     }
    33     printf("
    ");
    34     if (flag == N && even == N)
    35         printf("Eulerian
    ");
    36     else if (flag == N && odd == 2)
    37         printf("Semi-Eulerian
    ");
    38     else
    39         printf("Non-Eulerian
    ");
    40 }
    41 void DFS(int vertex)
    42 {
    43     if (Visit[vertex])
    44         return;
    45     Visit[vertex] = true;
    46     flag++;
    47     for (int i = 0; i < G[vertex].size(); i++)
    48         if (!Visit[G[vertex][i]])
    49             DFS(G[vertex][i]);
    50         
    51 }
  • 相关阅读:
    【STM32F407的DSP教程】第4章 Matlab简易使用之脚本文件
    【STM32H7的DSP教程】第3章 Matlab简易使用之基础操作
    【STM32F429的DSP教程】第3章 Matlab简易使用之基础操作
    【STM32F407的DSP教程】第3章 Matlab简易使用之基础操作
    【STM32H7的DSP教程】第2章 Matlab R2018a的安装
    【STM32F429的DSP教程】第2章 Matlab R2018a的安装
    【STM32F407的DSP教程】第2章 Matlab R2018a的安装
    【STM32H7的DSP教程】第1章 初学数字信号处理准备工作
    【STM32F429的DSP教程】第1章 初学数字信号处理准备工作
    【STM32F407的DSP教程】第1章 初学数字信号处理准备工作
  • 原文地址:https://www.cnblogs.com/yinhao-ing/p/10678351.html
Copyright © 2020-2023  润新知