一笔画--PTA

news/2024/7/15 17:19:52 标签: 深度优先, 图论, 算法, 欧拉通路, 欧拉回路, C++

文章目录

  • 题目描述
  • 思路
  • AC代码

题目描述

在这里插入图片描述
在这里插入图片描述

输入样例1
3 2
1 2
2 3
输出样例1
Y

输入样例2
4 3
1 2
1 3
1 4
输出样例2
N

输入样例3
1 0
输出样例3
Y

思路

dfs 、欧拉通路欧拉回路的判定

前导知识

欧拉通路欧拉回路欧拉图
无向图:
①设G是连通无向图,则称经过G的每条边一次并且仅一次的路径为欧拉通路
②如果欧拉通路是回路(起点和终点是同一个顶点),则称此回路为欧拉回路
有向图:
①设D是有向图,D的基图连通,则称经过D的每条边一次并且仅一次的有向路径为有向欧拉通路
②如果有向欧拉通路是有向回路,则称此有向回路为有向欧拉回路
总结
欧拉通路就是从点①出发,到点②,(①②不一定相同)经过该连通图所有路径仅一次;
欧拉回路就是点①和点②一定相同

欧拉通路的判定
①无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的
②有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度

欧拉回路的判定
①无向图:图连通,所有顶点都是偶数度。
②有向图:图连通,所有的顶点出度=入度。

存储结构
1.二维数组g存储图
2.一维数组cnt统计每个点的度数
3.一位数组vis标记每个数组是否被访问过

具体做法
1.使用邻接矩阵构建图,同时统计每个点的度数
2.该图可以一笔画,肯定存在欧拉通路或者欧拉回路,二者都要考虑,根据前面无向图欧拉通路欧拉回路的判定知,需要首先满足度数条件,否则该图肯定不能一笔画
3.从每个点进行一次dfs,判断图是否可以连通

AC代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int g[N][N]; //存储节点间的关系
bool vis[N]; //标记每个点是否都被访问过
int cnt[N]; //统计每个点的度数
int num; //统计度数为奇数的点的个数
bool flag; //标记是否可以一笔画
int n, m;

void dfs(int x)
{
    for(int i = 1; i <= n; i ++)
    {
        if(g[x][i] && !vis[i])
        {
            vis[i] = true;
            dfs(i);
        }
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 0; i < m; i ++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        g[x][y] = 1;
        g[y][x] = 1;
        cnt[x] ++;
        cnt[y] ++;
    }
    
    for(int i = 1; i <= n; i ++)
    {
        if(cnt[i] % 2 == 1) num ++;
    }

    if(num != 2 && num != 0) printf("N\n"); //不满足存在欧拉通路 或者 欧拉回路的条件
    else
    {
        for(int i = 1; i <= n; i ++)
        {
            memset(vis, false, sizeof(vis));
            vis[i] = true; //起点初始化为访问过
            flag = true; //假设本次从i出发可以一笔画完
            dfs(i);
            for(int j = 1; j <= n; j ++)
            {
                if(!vis[j])
                {
                    flag = false;
                    break;
                }
            }
            if(flag) break;
        }
        if(flag) printf("Y\n");
        else printf("N\n");
    }
    return 0;
}

欢迎大家批评指正!!!


http://www.niftyadmin.cn/n/5446558.html

相关文章

Educational Codeforces Round 163 (Rated for Div. 2)(A,B,C,D,E)

比赛链接 好忙好忙好忙&#xff0c;慢慢补老比赛的题解了。 这场没啥算法&#xff0c;全是思维。有也是BFS&#xff0c;屎。 A. Special Characters 题意&#xff1a; 您将得到一个整数 n n n 。 您的任务是构建一串大写的拉丁字母。此字符串中必须正好有 n n n 个特殊字…

从OLTP到OLAP——00年代数据库的演进与创新之旅

引言 在数字化浪潮的推动下&#xff0c;数据库技术已成为支撑数字经济的坚实基石。腾讯云 TVP《技术指针》联合《明说三人行》特别策划的直播系列——【中国数据库前世今生】&#xff0c;我们将通过五期直播&#xff0c;带您穿越五个十年&#xff0c;深入探讨每个时代的数据库演…

设计模式深度解析:适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼 探索设计模式的魅力&#xff1a;深入了…

BM83 字符串变形

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param s string字符串 * param n int整型 * return string字符串*/public String trans (String s, int n) {// write co…

【PHP】通过PHP安装数据库并使数据初始化

一、前言 有些CMS在部署的时候不用使用数据库工具&#xff0c;而是通过数据库安装页面就能完成数据库创建和数据填充&#xff0c;所以自己就想动手做一个这样的功能&#xff0c;这样在给别人安装系统的时候就不用再那么麻烦了&#xff0c;直接一键安装解决了。 二、效果图 输…

每日一题 第二十八期 洛谷 字符串的展开

[NOIP2007 提高组] 字符串的展开 题目描述 在初赛普及组的“阅读程序写结果”的问题中&#xff0c;我们曾给出一个字符串展开的例子&#xff1a;如果在输入的字符串中&#xff0c;含有类似于 d-h 或者 4-8 的字串&#xff0c;我们就把它当作一种简写&#xff0c;输出时&#…

matlab实现神经网络检测手写数字

一、要求 1.计算sigmoid函数的梯度&#xff1b; 2&#xff0e;随机初始化网络权重&#xff1b; 3.编写网络的代价函数。 二、算法介绍 神经网络结构&#xff1a; 不正则化的神经网络的代价函数&#xff1a; 正则化&#xff1a; S型函数求导&#xff1a; 反向传播算法&…

RIP,EIGRP,OSPF的区别

1.路由协议 能否选择出最优路径 2.路由协议 是否能够完成故障切换/多久能够完成故障切换 3.路由协议 是否会占用过大硬件资源 -- RIP -- 路由信息协议 跳数&#xff1a;一次三层设备的转发算一跳 中间隔的设备数量 不按照链路带宽来算 Rip认为路径一样&#xff0c;这个时…