首页 > 其他分享 >一笔画

一笔画

时间:2023-12-10 18:01:50浏览次数:24  
标签:度数 遍历 笔画 奇数 int 访问 节点

如题:

思路:

1)该路径必须覆盖图中的所有边(即每条边都必须被遍历一次)

2)一笔画问题的连通图中有一个度数为奇数的节点,那么必定需要存在另一个度数为奇数的节点,否则这两个节点无法通过路径相连。在一个连通图中,节点的度数是相同的,所以奇数度数的节点必定成对出现。如果奇数度数的节点数大于2,那么无论如何都无法找到一条路径使得每条边都被遍历一次。

3)没有奇数度数节点,可以从任意节点开始遍历,路径会覆盖所有边。有两个奇数度数节点,路径从其中一个奇数度数节点开始,经过所有边以后会回到另一个奇数度数节点。

1、定义一个1001 x 1001的二维数组 graph 来表示图的连接情况。

2、使用一个循环读取 m 条边的信息,包括连接的两个节点的编号,并在邻接矩阵 graph 中设置对应的连接关系。

3、数组 visited,用于标记节点是否已经被访问。将数组中所有元素初始化为0,表示所有节点均未被访问。

4、dfs 函数来实现深度优先搜索。该函数的参数包括当前节点 node 和总节点数 n。首先将当前节点标记为已访问,然后遍历邻接矩阵中与当前节点相连的节点,若邻接矩阵中存在边且相邻节点未被访问过,则递归调用 dfs 函数来访问相邻节点。

5、如果起始节点的数量为0或2个,则可以进行一笔画。我们使用一个循环遍历所有的节点,统计每个节点的度数(即与之相连的边的数量),如果某个节点的度数为奇数,则将变量 start 的值增加1。最后检查 start 的值,如果等于0或2,则满足条件。

6、遍历 visited 数组,如果存在未访问的节点,则图不是连通的。

#include <stdio.h>

#define MAXN 1001  // 图中节点的最大数量,设为 1000 方便处理

int graph[MAXN][MAXN];  // 图的邻接矩阵表示
int visited[MAXN];       // 标记节点是否已经被访问

void dfs(int node, int n) {

    visited[node] = 1;  // 标记当前节点为已访问

    for (int i = 1; i <= n; ++i) {

        if (graph[node][i] && !visited[i]) {  // 存在边且未被访问
            dfs(i, n);  // 递归访问相邻节点
        }
    }
}

int main() {

    int n, m;
    scanf("%d %d", &n, &m);

    // 初始化邻接矩阵
    for (int i = 0; i < m; ++i) {
        int u, v;
        scanf("%d %d", &u, &v);
        graph[u][v] = graph[v][u] = 1;  // 无向图,两个方向都要设置
    }

    // 初始化访问标记数组
    for (int i = 1; i <= n; ++i) {
        visited[i] = 0;
    }

    int start = 0;  // 记录起始节点的数量

    for (int i = 1; i <= n; ++i) {

        int degree = 0;  // 当前节点的度

        for (int j = 1; j <= n; ++j) {
            degree += graph[i][j];  // 统计当前节点的度
        }

        if (degree % 2 == 1) {
            start++;  // 度数为奇数的节点数量增加
        }
    }

    if (start == 0 || start == 2) {  // 如果起始节点的数量为 0或 2,则可以进行一笔画

        dfs(1, n);  // 从第一个节点开始深度优先搜索

        for (int i = 1; i <= n; ++i) {

            if (!visited[i]) {  // 如果有未访问的节点,说明图不连通
                printf("N\n");
                return 0;
            }
        }
        printf("Y\n");  // 遍历完成后图是连通的
    } 
    else {
        printf("N\n");  // 起始节点的数量不符合条件
    }

    return 0;
}

标签:度数,遍历,笔画,奇数,int,访问,节点
From: https://www.cnblogs.com/kirei7/p/17892991.html

相关文章

  • Python实现汉字人名按拼音或笔画顺序排序
    任务描述:编写Python程序,对给定的多个人名按笔画多少或拼音排序。主要思路:把每个汉字对应的笔画数量按Unicode编码顺序存入文本文件以便重复利用,内容如下图,所有数字存为一行,相邻数字使用英文半角逗号分隔。可以后台发送消息“汉字笔画”下载这个文件。对于给定的汉字获取Unicode编码......
  • 用Wpf做一个画笔画板(续5-Diagram画板)
    先上效果图吧同样老规矩,先上源码地址:https://gitee.com/akwkevin/aistudio.-wpf.-diagram本次实现的内容有[1]画笔实现[2]封闭画笔实现[3]钢笔实现[4]文字画笔[5]直线,矩形,椭圆[6]Path形状[7]取色器[8]三种画笔可选画笔示例入口  示例截图 核心代......
  • PostgreSQL数据库支持中文拼音和笔画排序
    PostgreSQL数据库支持中文拼音和笔画排序1.前言默认安装,PG是不支持中文拼音和笔画排序的。1postgres=# select * from pg_settings where name ~ 'collate';2    name    | setting | unit |    category    |            short_d......
  • 一笔画图形的判断方式
    一、笔画的概念1、一笔画是讨论某图形是否可以一笔画出。图形中任何端点根据所连接线条数被分为奇点、偶点。只有所有点为偶点的图形和只有两个奇点的图形一定可以一笔画......
  • 一笔画路径生成(c++版)
    一笔画路径生成(c++)练习图的遍历、回溯新建一个OnePen类;使用setNodeNum()方法设置节点数量;使用setNodeJoin()设置节点连线;执行drawLine()方法即可得出该图的一笔画......
  • PS新手教程-如何使用PS给人物制作简单的工笔画效果
    如何使用PS给人物制作简单的工笔画效果?给大家介绍如何使用PS给人物制作简单的工笔画效果,一起来看看吧。1.打开ps,打开素材图片2.Ctrl+j复制一层,Ctrl+Shift+u去色3.Ctrl+j在......
  • 2022NOIP A层联测29 A B C D(特殊数列 数进制数 最短路之和 一笔画)
    T1[状态压缩DP]给出\(n,m,p,q,r\),求长度是n,值域在\([1,m]\)之间的序列个数,满足\(\exists1\leqx<y<z<k\leqn,\)\(sum(x,y-1)=p,sum(y,z-1)=q,sum(z,k)=r\).(n<=50,max(p......
  • 改变Oralce 对简体汉字的排序规则(拼音、部首、笔画)转
    如果​​数据库​​​字符集选用的是ZH16GBK,那么使用orderby默认是按照汉字的“二进制编码”顺序进行排序的。有方法改变这个默认规则么?答案是肯定的,​​​Oracle​​​针......
  • puzzle(103.1)网格图一笔画
    目录​​一,一笔画完(网格图带起点)​​​​二,网格图不带起点​​​​三,六边形网格图​​一,一笔画完(网格图带起点)一笔画完(微信小程序游戏):这个游戏和我攻略过的另外2个游戏相关......
  • 简笔画~兔子
    •介绍简笔画,兔子。•步骤[captionid="attachment_3435"align="aligncenter"width="268"]​​​​简笔画~兔子1[/caption][captionid="attachment_3436"align="ali......