【数据结构】A : A DS图_传递信息

news/2024/7/20 22:35:30 标签: 数据结构, 深度优先, 算法

A : A DS图_传递信息

Description

小明在和他的小伙伴们玩传消息游戏,游戏规则如下:

  1. 有n名玩家,所有玩家编号分别为0~n-1,其中小明编号为0;
  2. 每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传消息的关系是单向的(即,有向边)。
  3. 每轮信息必须传递给另一个人,且信息可重复经过同一个人。

给定总玩家数n,以及按[玩家编号,对应可传递玩家编号]关系组成的二维数组relation。输出信息从小明(编号0)经过k轮传递到编号为n-1的小伙伴处的方案数;若不能到达,则输出0。

例如,对于n = 5, len = 7, relation = [[0,2],[2,1],[3,4],[2,3],[1,4],[2,0],[0,4]], k = 3,信息从编号0处开始,经3轮传递,到达编号4,共有3种方案:分别是0->2->0->4,0->2->1->4,0->2->3->4。

Input

第一行输入t,表示有t个测试样例。

接着,首先输入n,表示有n名玩家,接着输入len,表示接下来要输入的二维数组的长度,接着依次输入relation数组,接着输入k。

以此类推,共输入t个测试样例。

Output

每一行输出当前测试样例的方案数量。

以此类推共输出t行。

Sample

Input

3

5
7
0 2
2 1
3 4
2 3
1 4
2 0
0 4
3

3
2
0 2
2 1
2

4
6
0 1
0 2
0 3
1 2
1 3
2 3
3

Output

3
0
1

解题思路:

void DFS(int** data, int now, int x)用于深度优先搜索所有可能的信息传递路径。

  • int now: 当前玩家的编号。
  • int x: 剩余的传递轮数。
  • 在递归的每一步,函数都会检查是否到达了目的地(编号为n-1的玩家)且剩余轮数为0。如果是,就增加一种方案。
  • 接着,函数会遍历所有可能的下一个接收者,并对每个可能的接收者递归地调用自身。
  • 需要注意的是,这道题不需要定义一个数组visited来记录是否已经来过。

AC代码

#include<iostream>
using namespace std;
// SZTU forever
// 咋改代码?变局部全局,拆类建类,while和for变换
int totalPlayers;
int totalWays;
int numTests;
int relationCount;
int rounds;

void DFS(int** messagePaths, int currentPlayer, int remainingRounds) {
    if (currentPlayer == totalPlayers - 1 && remainingRounds == 0) {
        totalWays++;
        return;
    }
    for (int i = 0; i < totalPlayers; i++)
    {
        if (messagePaths[currentPlayer][i] == 1 && remainingRounds > 0)
        {
            DFS(messagePaths, i, remainingRounds - 1);
        }
    }
    return;
}

int main() 
{
    cin >> numTests;
    while (numTests--) {
        totalWays = 0;
        cin >> totalPlayers;
        int** messagePaths = new int* [totalPlayers];
        for (int i = 0; i < totalPlayers; i++)
            messagePaths[i] = new int[totalPlayers]();

        cin >> relationCount;
        while (relationCount--) {
            int sender, receiver;
            cin >> sender >> receiver;
            messagePaths[sender][receiver] = 1;
        }

        cin >> rounds;
        DFS(messagePaths, 0, rounds);
        cout << totalWays << endl;

        for (int i = 0; i < totalPlayers; i++)
            delete[] messagePaths[i];
        delete[] messagePaths;
    }
    return 0;
}


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

相关文章

springboot(ssm中医学习服务管理系统 医学生在线学习平台Java(codeLW)

springboot(ssm中医学习服务管理系统 医学生在线学习平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或…

详解自动化之单元测试工具Junit

目录 1.注解 1.1 Test 1.2 BeforeEach 1.3 BeforeAll 1.4 AfterEach 1.5 AfterAll 2. 用例的执行顺序 通过 order() 注解来排序 3. 参数化 3.1 单参数 3.2 多参数 3.3 多参数(从第三方csv文件读取数据源) 3.4 动态参数ParameterizedTest MethodSource() 4. 测试…

ElasticSearch之Nodes info API

查看当前集群中各节点的信息&#xff0c;执行如下命令&#xff1a; curl -X GET "https://localhost:9200/_nodes?pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"本接口允许指定节点和指标。 当前支持的指标&#…

信息压缩模型在自然语言处理中的应用和探讨

信息压缩模型在自然语言处理中的应用和探讨 摘要:正文:结论:附录:摘要: 随着人工智能和深度学习的发展,自然语言处理(NLP)在信息处理中的角色变得越来越重要。然而,海量的自然语言数据为信息处理带来了挑战——更多的信息通常意味着更高的处理成本,并可能导致效率降低。为…

python 基于gdal,richdem,pysheds实现 实现洼填、D8流向,汇流累计量计算,河网连接,分水岭及其水文分析与斜坡单元生成

python gdal实现水文分析算法及其斜坡单元生成 实现洼填、D8流向,汇流累计量计算,河网连接,分水岭 # utf-8 import richdem as rdre from River import * from pysheds.grid import Grid import time from time import time,sleep import numpy as np from osgeo import g…

pyinstaller打包生成的.spec文件解析

PyInstaller是一个用于将Python程序打包为可执行文件的工具。它的.spec文件是用来配置打包过程的脚本文件。 .spec文件是一个Python脚本&#xff0c;用于指定PyInstaller如何处理源代码、依赖项、资源文件等。它包含了一系列的参数和选项&#xff0c;用于控制打包的行为和生成…

机器学习入门(第二天)——感知机

概述 每个算法都是为了解决一类问题&#xff0c;或者说解决之前的问题所创造出来的&#xff0c;而感知机&#xff0c;在解决一类问题的时候也暴露了很多问题&#xff0c;变相的推动了以后的算法的改进方向。 知识树 苹果表示相对重要的 直观介绍 现在有一盘红豆和绿豆&#…

【Hello Go】Go语言网络编程

Go语言网络编程 Go语言程序服务端客户端 Http程序 有关网络的基本知识我之前的博客介绍的很详细 这里就不再赘述了 这里主要讲解下Go语言网络编程的语法 网络基础 协议 Go语言程序 我们建立一个tcp链接的步骤为 socket bind listen accept 但是在Go语言中 我们并不需要前两…