nyoj ACM:一笔画问题(DFS 递归 欧拉图 连通性)

笔试 | 一笔画问题之一步走完所有格点 给一个n*m的点矩阵,如何不重复的一步走完所有点。输入n, m 代表矩阵的行和宽,n和m不同时为1(1 阅读详情

一笔画问题
时间限制:3000 ms | 内存限制:65535 KB
难度:4
描述
zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。

规定,所有的边都只能画一次,不能重复画。

输入
第一行只有一个正整数N(N<=10)表示测试数据的组数。
每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P)
随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线。
输出
如果存在符合条件的连线,则输出”Yes”,
如果不存在符合条件的连线,输出”No”。
样例输入
2
4 3
1 2
1 3
1 4
4 5
1 2
2 3
1 3
1 4
3 4
样例输出
No
Yes

一笔画有3种情况:
1. 从A点开始最后回到了A点结束
2. 从A点开始到达B点结束
3. 从A点开始经过B点,C点,D点,最后在B点结束。

由于是无向图,所以一个点的度=他的入度+他的出度。如果度为1,则表明他缺少入度或者出度,那么他一定是端点。

最后,我们还要检验该图是否连通。连通图不一定是成立,但是加上度为奇数的点的个数小于或等于2这个条件,就成立了。

解题思路:1 如果图中所有的点连通且度都为偶数则可以一笔画成。
2 如果图中有不超过2个点的度为奇数则可以一笔画。
3做法显然先通DFS判断图是否连通过,然后在判断图中奇数点度的个数即可。

我的代码:

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
int a[1010][1010];//用邻接矩阵来存储图 
int flag=0;
int P,Q;
void DFS(int han)
{
    //递归形式的第一部分:递归在简单情境下的退出
    if(han>P)
        return;
    //递归形式的第二部分:由于此时还不是简单情形,那么就要继续将改问题减少成更小的子问题 
    for(int j=1;j<=P;j++) 
    {
        if(a[han][j]==1)
        {
            a[han][j]=0;//没有遇到一个点把他标位0。结束后,如果矩阵全为0,则表明图为连通的。
            DFS(j);
        }
    }

}
int main()
{
    int N;
    scanf("%d",&N);
    for(int k=0;k<N;k++)
    {

        scanf("%d%d",&P,&Q);//P是点,Q是边 
        memset(a,0,sizeof(a));
        int A,B;
        for(int j=0;j<Q;j++)
        {
            scanf("%d%d",&A,&B);
            a[A][B]=1;
            a[B][A]=1;
        }
        //判断度数为奇数的点的个数 ,记为c 
        int c=0;
        for(int i=1;i<=P;i++)
        {
            int num=0;
            for(int j=1;j<=P;j++)
            {
                if(a[i][j]==1)
                    num++;
            }
            if(num%2==1)
                c++;
        }

        flag=0;
        if(c<=2)//度数为奇数的点的个数小于等于2
        {
            DFS(1);//再判断该图是否连通 
            for(int i=1;i<=P;i++)
            {
                for(int j=1;j<=P;j++)
                {
                    if(a[i][j]==1)
                        flag=-1;
                }
            }
            if(flag==-1)
                flag=0;
            else
                flag=1;
        }

        if(flag==0)
            printf("No\n");
        else
            printf("Yes\n");

    }
    return 0;
}
C++【认知系列】鼠标连点 C++鼠标连点,按下F2开始整活 #include <iostream> #include <Windows.h> //windows系统库,鼠标点击、按键和时差需要用到 #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) //点击信号获取 int main ( ) { //循环判断点击 while ( 1 ) { while ( KEY_DOWN ( 阅读详情

相关推荐

一笔画问题【经典递归】

//摘取题目 题目描述 对给定的一个无向图,判断能否一笔画出。若能,输出一笔画的先后顺序,否则输出“No Solution!” 所谓一笔画出,即每条边仅走一次,每个顶点可以多次经过。 输出字典序最小的一笔画顺序。 输入 第1行:1个整数n,表示图的顶点数(n<=100) 接下来n行,每行n个数,表示图的邻接矩阵 输出 第1行:一笔画的先后顺序,每个顶点之间用一个空格分开 样例输入 Copy ...

yao____yi的博客 568

hdu3018 Ant Trip【欧拉图】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3018 题意:给你n个点,m条边,问你几笔能画完所有边 解析:首先这个图不连通,所以要分成几块来计算,每一块都有三种情况,如果是个欧拉图,那就一笔画玩,如果是孤立点那就不管,如果是其他的,那就输有几个度数为奇数的点,奇点/2就是总笔画数,所以ans = 奇点/2+欧拉图个数#include <iost

22h's Blog 355

一笔画问题——DFS

一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。 规定,所有的边都只能画一次,不能重复画。 输入 第一行只有一个正整数N(N&lt;=10)表示测试数据的组数。 每组测试数据的第一行有两个正整数P,...

zhaohaibo的博客 1961

hdu 1116(欧拉图典型应用)

参考百度文库https://wenku.baidu.com/view/b245abaad1f34693daef3eae.html 欧拉回路 不重复地经过每条边的回路。 欧拉路径 不重复地经过每条边的路径。 欧拉图  存在欧拉回路的图。 半欧拉图 存在欧拉路径的图。 无向欧拉图的判定 ¡无向图存在欧拉回路的充要条件: 连通且没有奇点。 ¡ ¡无向图存在欧拉路径的充要条件: 连通且

sdnulixianrui的博客 1816

acm模板(村村通,一笔画,最长单调不升序列等)

acm模板(村村通,一笔画,最长单调不升序列等) 最长单调不升序列 问题描述 给定一个n个元素的数列a1,a2,…,an,求该序列中单调不升序列中最长者的长度。如34,78,53,36,40的最长单调不升序列有78,53,36或78,53,40,长度都是3。

一笔画问题,图通路判断

判断一个图是否能够用一笔画下来。 规定,所有的边都只能画一次,不能重复画。 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数。 每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P) 随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线。 输出 如果存在符合条件的连线,则输出"Yes", 如果不存在符合条件的连线,输出"No"。

浙江大学ACM俱乐部 2029:欧拉回路

说实话,看到这道题我还不懂什么叫“欧拉回路”、、、

u013563866的专栏 608

告别VMware Tools!用open-vm-tools在Ubuntu 22.04上搞定共享文件夹(附开机自动挂载)

本文详细介绍了在Ubuntu 22.04上使用open-vm-tools替代VMware Tools实现高效共享文件夹管理的方法。通过开源工具open-vm-tools,用户可避免传统方案的兼容性问题,享受自动适配内核、系统更新同步等优势。文章包含从安装配置到开机自动挂载的全流程指导,特别适合在VMware虚拟机中运行Ubuntu Desktop的开发者提升工作效率。

weixin_32520095的博客 585

hdu 1116 Play on Words(欧拉图判断模板)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1116(并查集+欧拉通路的判断,模板!!!) 思路:这个题目用到了并查集的操作,先将所有的点弄到一个或者多个集合中。并查集处理的过程中,将被处理的点标记一下,表示已经被访问过。过程中要统计各个点的出度和入度。 一般判断欧拉回(通)路的过程: 1)这个图必须是连通的,即根结点只有一个。如果不是,

china震震的博客 427

Intouch实时报警

Intouch实时报警功能的相关设置

weixin_41571357的博客 4204

5G物理层基础知识

1、关于RB和RE (1) RB(Resource Block,资源块)频率上连续12个子载波,时域上一个slot(时隙,14个ofdm符号) (2) RE(Resource Element,资源单元)频率上一个子载波,及时域上一个ofdm符号 注意:协议规定,5G每个时隙(非扩展CP)的符号数为14个(扩展CP情况下每个时隙有12个符号),而LTE(非扩展CP)每个时隙的符号数为7个。 简单说:一个12X14的方格,大的整个叫一个RB,每一个小块叫一个RE。另外,一个RE可存放一个调制符号(mo.

qq_39074243的博客 2万+

zzuli 1480 欧拉图

题目链接:http://acm.zzuli.edu.cn/showproblem?problem_id=1480题意:判断一个图是否存在欧拉回路思路:如果一个图存在欧拉回路,则图中所有点均为偶点且是连通图,先判断是否有奇点,然后判断是否连通#include #include int G[105][105],f[105],p[105]; struct road{ int a,b; }s[2005]; int count,n,m; void dfs(int v) { int i; fo

Acceptyly的专栏 515

从零到一:桌面宠物的硬件架构设计与工程实践

本文详细介绍了基于STM32F103C8T6主控平台的桌面宠物机器人硬件架构设计与工程实践。内容涵盖电源管理、舵机控制、PCB布局及系统调试等核心环节,为硬件爱好者提供从零到一的完整开发指南,助力打造稳定可靠的智能桌面伴侣。

alice7model的博客 1113

NYOJ 单词拼接(求有向图的欧拉通路)

单词拼接 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 http://acm.nyist.net/JudgeOnline/problem.php?pid=99 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串。 前一个单词的结尾应该与下一个单词的道字母相同。 如 aloha dog ara

温姑娘的博客 1279

GitHub漏洞挖掘与CVE提交实战指南:从发现到编号的完整链路

GitHub开源项目是现代软件供应链的核心节点,其安全漏洞直接影响全球数百万系统的机密性、完整性与可用性。理解漏洞本质需回归CIA三元组原理,而真实可利用性依赖对协议解析层、配置加载区和依赖传递链等高危模块的精准识别。技术价值在于将模糊的‘可疑逻辑’转化为符合MITRE CVE标准的可验证事件,支撑SDL流程、威胁情报建设与供应链风险管理。典型应用场景包括甲方安全工程师推动供应商修复、独立研究者参与负责任披露,以及DevSecOps团队构建自动化风险坐标系。本文基于27次CVE提交经验,聚焦GitHub代码

weixin_33646989的博客 651

验证(uvm常见问题)--子类和父类的句柄和对象问题

sv中的子类和父类 在sv中,有如下两个类,child继承于parent。然后在test module中,正确转换的方法如下面所示。其中c1,c2,p1 都指向了同一个子类的对象c1。总结如下: 一个子类的对象是包括子类的成员变量,方法和父类的成员变量,方法。 子类的句柄c1可以直接赋值给父类的句柄p1,此时p1只可以访问父类的成员变量和方法,或者子类的虚方法,比如下面调用p1.display是...

q876507447的博客 7633

NYOJ 99 单词拼接

单词拼接 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 给你一些单词,请你判断能否把它们首尾串起来串成一串。 前一个单词的结尾应该与下一个单词的道字母相同。 如 aloha dog arachnid gopher tiger rat   可以拼接成:aloha.ara

humantic的专栏 1196

大津法(OTSU)点云强度信息分割

大津法(OTSU)是一种灰度图像自适应的阈值分割方法,大津法根据图像的灰度分布,将图像分成背景和前景两部分,前景就是需要按照阈值分割出来的部分。由于点云的强度信息的特性,也可以利用此方法进行分类,但需要保证信息干扰较少,例如道路标线分割等场景较为适用。

qq_48694523的博客 966

HDU5883之欧拉图

题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=5883官方题解: 判断一下是欧拉回路还是通路就好,如果不是的话就直接impossible代码:#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> const int MAXN=100010;us

superxtong的博客 427

【TRAE调教指南之MCP篇】Context 7 MCP:让AI永远拥有最新技术文档

【TRAE调教指南之MCP篇】Context 7 MCP:让AI永远拥有最新技术文档

funfan的博客 1316

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

1341:【例题】一笔画问题 欧拉回路

【题目描述】 如果一个图存在一笔画,则一笔画的路径叫做欧拉路,如果最后又回到起点,那这个路径叫做欧拉回路。 根据一笔画的两个定理,如果寻找欧拉回路,对任意一个点执行深度优先遍历;找欧拉路,则对一个奇点执行dfs,时间复杂度为O(m+n),m为边数,n是点数。 【输入】 第一行n,m,有n个点,m条边,以下m行描述每条边连接的两点。 【输出】 欧拉路或欧拉回路,输出一条路径即可。 【输入样例】 5 5 1 2 2 3 3 4 4 5 5 1 【输出样例】 1 5 4 3 2 1 #include<i

qq_43738331的博客 2715

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

acm第二十三次图的遍历

一、深度优先与广度优先遍历   从图中某一顶点出发系统地访问图中所有顶点,使每个顶点恰好被访问一次,这种运算操作被称为图的遍历。为了避免重复访问某个顶点,可以设一个标志数组visited[i],未访问时值为false,访问一次后就改为true。   图的遍历分为深度优先遍历和广度优先遍历两种方法,两者的时间效率都是O(n*n)。 1.深度优先遍历   深度优先遍历与深搜DFS相似,从一个点A出发,...

qq_43550247的博客 363

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

puzzle(0122)网格一笔画

。。

nameofcsdn的博客 4284

c++ 遍历所有点且距离最短_编程小白暑期进阶笔记41-C语言数据结构与算法图遍历的应用...

基于广度优先遍历算法的应用思考题:(思考题答案:BFS(广度优先遍历)在一般的带权图中是不能解决最短路问题,了解BFS的都知道,BFS是根据节点到源节点之间的节点数遍历的,也就是先访问离源节点节点数最少的点。要使得BFS能计算最短路径,需要图结构满足所有的权值相等。否则应该使用dijkstra算法去解决最短路。权值相等的这种情况,在解决迷宫问题的时候有很好的表现能力。因为迷宫问题满足下面几个特点:...

weixin_34646820的博客 276

南阳理工ACM42——一笔画问题

一笔画问题,也就是欧拉道路,这一题,简单的欧拉回路的应用。 什么是欧拉回路? 欧拉回路就是在图A中,存在一条路径使得每一条边都走过一次,并且这条路径是一个圈,就是欧拉回路。 欧拉回路的判断: 1.在有向图中:首先必要的条件是图连通,所以顶点的入度都等于出度。 2.在无向图中:首要条件还是图连通,其次就是所以顶点都是偶数度(该顶点的度为偶数) 这一题,还需要加上一个条件,也就是存在两个奇

XD 1279

一笔画(AC)DFS算法

小丁最近迷恋上一个游戏,传说中的“一笔画”游戏。那么什么是一笔画?如下图,顾名思义就是一笔可以完成的图。一笔画最基本的要求是在画图的过程中,笔不能离开纸,且笔所画过的线不能重复,最后画完所有的线便算完成虽然小丁喜欢玩这个游戏,但有时候花费半天也找不到答案。小丁听说写一个计算机程序便能判断是否可以一笔画图,所以他希望善良可爱的你来帮帮他的忙。快来帮帮弱小,可怜,又无助的小丁。

m0_53303926的博客 1947
上一篇: nyoj ACM:部分和问题(DFS 回溯 递归)
下一篇: nyoj ACM:zb的生日(DFS 递归 回溯)
丁磊_Ml
博客等级 码龄11年 95粉丝 139原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值