数据结构实验之图论四:迷宫探索

2023-05-16

数据结构实验之图论四:迷宫探索

Time Limit: 1000 ms Memory Limit: 65536 KiB

 

Problem Description

有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关;请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点?

Input

连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000)、边数M(M <= 3000)和起始结点编号S,随后M行对应M条边,每行给出一对正整数,表示一条边相关联的两个顶点的编号。

 

Output

若可以点亮所有结点的灯,则输出从S开始并以S结束的序列,序列中相邻的顶点一定有边,否则只输出部分点亮的灯的结点序列,最后输出0,表示此迷宫不是连通图。
访问顶点时约定以编号小的结点优先的次序访问,点亮所有可以点亮的灯后,以原路返回的方式回到起点。

Sample Input


1
6 8 1
1 2
2 3
3 4
4 5
5 6
6 4
3 6
1 5  

Sample Output


1 2 3 4 5 6 5 4 3 2 1  

Hint

 

Source

xam

会有两种不同的图建立方式,给大家呈现一下

1:正常的用struck定义+DFS

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct node
{
    int u, v;
    int aa[1001][1001];
    int visit[1001];
} graph;

graph a;

int que[1001];
int c;

void dfs(int m)
{

    a.visit[m] = 1;
    que[c++] = m;
    for (int i = 1 ; i <= a.v ; i++)
    {
        if (!a.visit[i] && a.aa[m][i]==1)
        {
            dfs(i);
            que[c++] = m;
        }
    }
}

int main()
{
    int n ;
    scanf("%d", &n);
    while(n--)
    {
        memset(a.aa, 0, sizeof (a.aa));
        memset(a.visit, 0, sizeof (a.visit));
        int s, uu,vv;
        scanf("%d%d%d", &a.u, &a.v, &s);
        for (int i = 0 ; i < a.v ; i++)
        {
            scanf("%d %d", &uu,&vv);
            a.aa[uu][vv] = a.aa[vv][uu] = 1;
        }
        c = 0;
        dfs(s);
        for (int i = 0 ; i < c ; i++)
        {
            if (!i)
                printf("%d", que[i]);
            else
                printf(" %d", que[i]);
        }

        if (c == a.u*2-1)
        {
            printf("\n");
        }
        else
        {
            printf(" 0\n");
        }
    }
    return 0;
}

2:

这是一个比较偷懒 的方法,我可以用一个二维数组来储存图的点与边 的关系

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int a[1001][1001];
int visit[1001];
int que[1001];
int c;

void dfs(int m , int k)
{
    visit[k] = 1;
    que[c++] = k;
    for (int i = 1 ; i <= m ; i++)
    {
        if (a[k][i] == 1 && !visit[i])
        {
            dfs(m,i);
            que[c++] = k;

        }
    }
}

int main()
{
    int i , n , m , u ,v , s , t;
    scanf("%d" , &t);
    while(t--)
    {
        memset(a , 0 , sizeof (a));
        memset(visit , 0  , sizeof (visit));
        scanf("%d%d%d" , &n , &m , &s);
        for (i = 0 ; i < m ; i++)
        {
            scanf("%d %d" , &u , &v);
            a[u][v] = a[v][u] = 1;
        }
        c = 0;
        dfs(n , s);
        for (i = 0 ; i < c ; i++)
        {
            if (!i)
            {
                printf("%d" , que[i]);
            }
            else
            {
                printf(" %d" , que[i]);
            }
        }
        if (c == 2 * n - 1)
            printf("\n");
        else
            printf(" 0\n");
    }
    return 0;
}
 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构实验之图论四:迷宫探索 的相关文章

随机推荐

  • 数据结构上机测试4.1:二叉树的遍历与应用1

    数据结构上机测试4 1 二叉树的遍历与应用1 Time Limit 1000 ms Memory Limit 65536 KiB Submit Statistic Problem Description 输入二叉树的先序遍历序列和中序遍历序
  • 2、STM32点亮LED灯

    STM32寄存器和库函数点灯 一 寄存器操作1 新建工程 xff0c 新建一个目录存放以后所有的工程stmproject xff0c 在这个目录下新建文件夹寄存器点灯 xff0c 文件名为LED 2 新建文件main c并双击source
  • 数据结构实验之二叉树七:叶子问题

    数据结构实验之二叉树七 xff1a 叶子问题 Time Limit 1000 ms Memory Limit 65536 KiB Submit Statistic Problem Description 已知一个按先序输入的字符序列 xff
  • 数据结构实验之二叉树的建立与遍历

    数据结构实验之二叉树的建立与遍历 二叉树的基本操作 xff0c 中序遍历 xff0c 后序遍历 xff0c 前序遍历 xff0c 只是根节点输出的位置不同 xff0c 叶子结点 xff0c 深度 xff0c 需要自己理解 xff0c 也非常
  • 哈夫曼树

    什么是哈夫曼树 xff1f 让我们先举一个例子 判定树 xff1a 在很多问题的处理过程中 xff0c 需要进行大量的条件判断 xff0c 这些判断结构的设计直接影响着程序的执行效率 例如 xff0c 编制一个程序 xff0c 将百分制转换
  • 哈夫曼树的概念及其实现

    1 基本概念 a 路径和路径长度 若在一棵树中存在着一个结点序列 k1 xff0c k2 xff0c xff0c kj xff0c 使得 ki是ki 43 1 的双亲 xff08 1 lt 61 i lt j xff09 xff0c 则称此
  • 二叉排序树详解

    二叉排序树的介绍 二叉排序树为一颗二叉树 xff0c 或者为空 xff0c 或者满足如下条件 xff1a 如果它的左子树不为空 xff0c 那么左子树上的所有结点的值均小于它的根结点的值如果它的右子树不为空 xff0c 那么右子树上的左右结
  • 数据结构实验之队列一:排队买饭

    数据结构实验之队列一 排队买饭 这个题猛的一看可能会有点麻烦 xff0c 但是其实一点也不 xff0c 只要把每个情况用if条件语句分清就可以了 有一点栈的思想 Problem Description 中午买饭的人特多 食堂真是太拥挤了 买
  • bLue的文件查找器

    bLue的文件查找器 用结构体数组按顺序存储 xff0c 每次查找的时候只是判断最后的文件格式ex Problem Description bLue 的电脑里存了各种各样的文件 xff0c 随着文件越来越多 xff0c 查找文件也成了一个麻
  • 图的基本存储的基本方式二

    小编在网上看到好多博主的文章这道题都没有用结构体做 xff0c 数据量太大 xff0c 结构体也是一个不错的选择 但是结构体有一个不好的地方 xff0c 不能直接搜索 xff0c 只能每次从头开始搜索 xff0c 有点浪费时间 Proble
  • 图的基本存储的基本方式一

    这个题主要的是这个 stdbool h 这个函数 xff0c 还有bool这个数组 Problem Description 解决图论问题 xff0c 首先就要思考用什么样的方式存储图 但是小鑫却怎么也弄不明白如何存图才能有利于解决问题 你能
  • 图的基本存储的基本方式四

    一直不知道这个题为什么用链表可以A xff0c 但是结构体就会WA xff0c 如果有童鞋们知道 xff0c 希望能留下想法 xff0c 一起学习 xff0c 一起进步 Problem Description 解决图论问题 xff0c 首先
  • C# 超详细的WebService创建、发布与调用(VS2019)

    1 编写接口 这里我选择的是 ASP NET Web应用程序 NET Framework 填写好项目名称 选择项目位置以及所使用的框架 xff0c 这里我用的是 NET Framework 4 框架 xff0c 然后点击创建 继续点击创建
  • 图的基本存储的基本方式三

    图的基本存储的基本方式三 Problem Description 解决图论问题 xff0c 首先就要思考用什么样的方式存储图 但是小鑫却怎么也弄不明白如何存图才能有利于解决问题 你能帮他解决这个问题么 xff1f Input 多组输入 xf
  • 数据结构实验之栈与队列九:行编辑器

    数据结构实验之栈与队列九 xff1a 行编辑器 Problem Description 一个简单的行编辑程序的功能是 xff1a 接受用户从终端输入的程序或数据 xff0c 并存入用户的数据区 由于用户在终端上进行输入时 xff0c 不能保
  • 顺序表应用2:多余元素删除之建表算法

    顺序表应用2 xff1a 多余元素删除之建表算法 Time Limit 3 ms Memory Limit 600 KiB Submit Statistic Problem Description 一个长度不超过10000数据的顺序表 xf
  • 数据结构实验之链表四:有序链表的归并

    数据结构实验之链表四 xff1a 有序链表的归并 Problem Description 分别输入两个有序的整数序列 xff08 分别包含M和N个数据 xff09 xff0c 建立两个有序的单链表 xff0c 将这两个有序单链表合并成为一个
  • 数据结构实验之链表五:单链表的拆分

    数据结构实验之链表五 xff1a 单链表的拆分 Problem Description 输入N个整数顺序建立一个单链表 xff0c 将该单链表拆分成两个子链表 xff0c 第一个子链表存放了所有的偶数 xff0c 第二个子链表存放了所有的奇
  • 数据结构——二叉树的基本操作(不包括还原)

    小编没有写主函数 xff0c 你们需要用什么函数只需要自己写一个主函数调用一下就可以了 include lt stdio h gt include lt string h gt include lt stdlib h gt typedef
  • 数据结构实验之图论四:迷宫探索

    数据结构实验之图论四 xff1a 迷宫探索 Time Limit 1000 ms Memory Limit 65536 KiB Problem Description 有一个地下迷宫 xff0c 它的通道都是直的 xff0c 而通道所有交叉