zoukankan      html  css  js  c++  java
  • 图论

     


    给出一幅n个点,m条边的图,分别判断该图是无向图和有向图条件下,是否存在欧拉通路。

    输入

    输入包含多组数据。第一行为一个整数T(1 ≤ T ≤ 100),代表数据组数,对于每组数据: 第一行是两个整数n和m( 1 ≤ n ≤ 500, 0 ≤ m ≤ n(n − 1)/2 ),分别代表图上点的个数和边的个数。
    然后是m行,每行两个整数uivi ( 1 ≤ ui, vi ≤ n, ui ≠ vi ),代表图上的一条边所连接的两个点。输入保证没有重边。

    输出

    首先判断:如果这幅图是无向图,是否存在欧拉通路;
    其次判断:如果这幅图是有向图,是否存在欧拉通路。
    对于每个判断,如果存在,输出"Yes",否则输出"No"(不包括引号)。两个判断间用空格隔开。

    样例输入

    3

    2 1
    1 2

    4 3
    1 2
    1 3
    1 4

    4 4
    1 2
    1 3
    1 4
    2 3

    样例输出

    Yes Yes
    No No
    Yes No

    Hint

    欧拉通路、欧拉回路、欧拉图
    无向图
    1) 设 G 是连通无向图,则称经过 G 的每条边一次并且仅一次的路径为欧拉通路;
    2) 如果欧拉通路是回路 (起点和终点是同一个顶点), 则称此回路为欧拉回路 (Euler circuit);
    3) 具有欧拉回路的无向图 G 称为欧拉图(Euler graph)。
    有向图
    1) 设 D 是有向图, D 的基图连通,则称经过 D 的每条边一次并且仅一次的有向路径为有向欧拉通路;
    2) 如果有向欧拉通路是有向回路,则称此有向回路为有向欧拉回路(directed Euler circuit);
    3) 具有有向欧拉回路的有向图 D 称为有向欧拉图(directed Euler graph)。

    Extend

    欧拉回路打印路径算法:Fleury(佛罗莱)算法

    ----------------------------------------------------------我是分割线^_^-----------------------------------------------------------------

    欧拉通路: 通过图中每条边且只通过一次,并且经过每一顶点的通路。

    欧拉回路: 通过图中每条边且只通过一次,并且经过每一顶点的回路(可以回到原点,就是出发的那个点)。

     

    无向图是否具有欧拉通路或回路的判定:

    欧拉通路:图连通;图中只有0个或2个度为奇数的节点

    欧拉回路:图连通;图中所有节点度均为偶数

     

    有向图是否具有欧拉通路或回路的判定:

    欧拉通路:图连通;除2个端点外其余节点入度=出度;1个端点入度比出度大1;一个端点入度比出度小1 或 所有节点入度等于出度

    欧拉回路:图连通;所有节点入度等于出度

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<vector>
    #include<queue>
    using namespace std;
    
    #define Int __int64
    #define INF 0x3f3f3f3f
    
    const int MAXN = 555;
    int road[MAXN];
    int ingrade[MAXN], outgrade[MAXN], grade[MAXN];
    int n, m;
    int setsum;
    
    void init() {
        for (int i = 1; i <= n; i++) {
            road[i] = i;
        }
        setsum = n;
        memset(ingrade, 0, sizeof(ingrade));
        memset(outgrade, 0, sizeof(outgrade));
        memset(grade, 0, sizeof(grade));
    }
    
    int FindRoot(int rt) {
        return road[rt] == rt ? rt : (road[rt] = FindRoot(road[rt]));
    }
    
    int main()
    {
        //freopen("input.txt", "r", stdin);
        int cas;
        while (scanf("%d", &cas) != EOF) {
            while (cas--) {
                scanf("%d %d", &n, &m);
                init();//初始化函数要注意放的位置在哪里
                int u, v;
                for (int i = 1; i <= m; i++) {
                    scanf("%d %d", &u, &v);
                    ingrade[v]++;
                    outgrade[u]++;
                    grade[v]++;
                    grade[u]++;
                    int root1 = FindRoot(u);
                    int root2 = FindRoot(v);
                    if (root1 != root2) {
                        road[root2] = root1;
                        setsum--;
                    }
                }
                if (setsum != 1) {
                    printf("No No
    ");
                    continue;
                }
                int ans1 = 0;
                for (int i = 1; i <= n; i++) {
                    if (grade[i] % 2 == 1) ans1++;
                }
                if (ans1 == 0 || ans1 == 2) {
                    printf("Yes ");
                } else {
                    printf("No ");
                }
                bool ans2 = true;
                int door1 = 0, door2 = 0;
                for (int i = 1; i <= n; i++) {
                    if (ingrade[i] != outgrade[i]) {
                        if (!door1 && ingrade[i] - outgrade[i] == 1) door1 = 1;
                        else if (!door2 && ingrade[i] - outgrade[i] == -1) {
                            door2 = 1;
                        } else {
                            ans2 = false;
                        }
                    }
                }
                if (ans2) printf("Yes
    ");
                else printf("No
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    16.普通用户、网格长、网格员,操作数据(3)newapp/components/putong.vue
    15.普通用户、网格长、网格员,操作数据(2)newapp/pages/center/center.vue
    14.普通用户、网格长、网格员,操作数据(1)后端部分
    13.需求:在后台可以控制网格长和网格员在小程序端对数据的编辑权限
    Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触
    Asp.Net Core 3.1 获取不到Post、Put请求的内容 System.NotSupportedException Specified method is not supported
    [Hei.Captcha] Asp.Net Core 跨平台图形验证码实现
    基于IdentityServer4的OIDC实现单点登录(SSO)原理简析
    ASP.NET Core Swagger接入使用IdentityServer4 的 WebApi
    ASP.NET Core 使用 Google 验证码(reCAPTCHA v3)代替传统验证码
  • 原文地址:https://www.cnblogs.com/steamedbun/p/5741459.html
Copyright © 2011-2022 走看看