有向图的完全可达性(有向图搜索全路径的问题) C#DFs

在考察输入输出方面我觉得是道难题了 第一次遇见邻接表的数据结构该怎么声明  

卡码网105   在力扣没找见完全相同的题    感觉需要多练习多复习这种类型的题

105. 有向图的完全可达性

题目描述

给定一个有向图,包含 N 个节点,节点编号分别为 1,2,...,N。现从 1 号节点开始,如果可以从 1 号节点的边可以到达任何节点,则输出 1,否则输出 -1。

输入描述

第一行包含两个正整数,表示节点数量 N 和边的数量 K。 后续 K 行,每行两个正整数 s 和 t,表示从 s 节点有一条边单向连接到 t 节点。

输出描述

如果可以从 1 号节点的边可以到达任何节点,则输出 1,否则输出 -1。

输入示例
4 4
1 2
2 1
1 3
2 4
输出示例
1
提示信息

从 1 号节点可以到达任意节点,输出 1。

数据范围:

1 <= N <= 100;
1 <= K <= 2000。

思路:  深搜 1.确认递归函数 参数 
      需要传入地图,需要知道当前我们拿到的key,以至于去下一个房间(节点)。
同时还需要一个数组,用来记录我们都走过了哪些房间,
这样好知道最后有没有把所有房间都遍历的,可以定义一个一维数组。

Dfs时的终止条件判断  :如果我们是处理当前访问的节点,当前访问的节点如果是 true ,
说明是访问过的节点,那就终止本层递归,如果不是true,我们就把它赋值为true,
因为这是我们处理本层递归的节点。

需要注意的点:1.  List<List<int>> graph=new List<List<int>>(n+1); 数据结构 

List<List<int>> 是一个嵌套的 List 类型,表示一个包含多个整数列表的列表。可以把它看作是一个列表的列表。 

  1. graph 是一个 List<List<int>> 类型的变量,表示图的邻接表。它包含 n + 1 个 List<int> 元素,代表图中的 n + 1 个节点。
  2. 每个 List<int> 用来存储该节点的邻接节点。通过 graph[i].Add(x) 的方式,将节点 i 与其他节点 x 连接起来。
  3. 使用 string.Join(", ", graph[i]) 将每个列表中的元素格式化成字符串并打印出来,展示图的邻接关系。

2.List<int> suroudkey= graph[key];  这一部分的意思是检测到的key节点的相连接的节点取出来 为suroudkey列表中的数 其中的数就是相邻的节点

  • graph 是一个 邻接表,即 List<List<int>> 类型的数据结构,其中 graph[key] 代表节点 key 的所有邻接节点(即节点 key 直接相连的节点列表)。
  • suroudkey是一个 List<int>,保存了 key 节点的所有邻接节点的列表。  
  1. 访问当前节点:在调用 Dfs 函数时,当前节点会被访问。通常,DFS 会通过一个 visited 数组(或集合)来记录哪些节点已经被访问过,以避免重复访问。
  2. 遍历邻接节点:在 graph[key] 中,找出当前节点 key 所有直接相连的邻接节点,即 keys。对每一个邻接节点 nextKey,递归地调用 Dfs 函数进行深度优先遍历。
  3. 递归过程:递归调用会继续深入到下一个未被访问的邻接节点,直到遍历完当前节点的所有邻接节点。然后回溯到上一个节点,继续访问下一个未被访问的邻接节点。

代码实现:

using System;
using System.Collections.Generic;

class Program
{
        static void Main()
        {
                  //输入模式
             string[] input= Console.ReadLine().Split();
              int n=int.Parse(input[0]);
              int k=int.Parse(input[1]);
          
          //难点:需要进行邻接表初始化 
          //这个数据结构放到开头解释 
            List<List<int>> graph=new List<List<int>>(n+1);
            for(int i=0;i<=n;i++)
            {
                graph.Add(new List<int>());
            }
            //输入除第一行之外的信息  (边的信息)
              for(int i=0;i<k;i++)
              {
                  string[] edge=Console.ReadLine().Split();
                  s=int.Parse(edge[0]);
                  t=int.Parse(edge[1]);
                  //使用邻接表 表示s-》t是相连的
                  graph[s].Add(t);
              }
              
              //访问标记数值 这就是我们说的用来记录录都走过了哪些房间的一维数组
              bool[] visted=new bool[n+1];
              // 从节点一开始进行Dfs遍历 
              Dfs(graph,1,visted);
              //检测是否所有节点都被访问到了 
              for(int i=1;i<=n;i++)
              {
                  if(visted[i]==false) //如果检测了一遍发现有false 证明有的节点没被访问
                  {
                      //输出-1 
                      Console.WriteLine(-1);
                      return ;
                  }
                  //如果检测到的全部都为true 证明全被访问了 输出1 
                  Console.WriteLine(1);
              }
        }
      
      public static void Dfs( List<List<int>> graph,int key,bool[] visted)
      {
          //处理当前访问节点 
          if(visted[key]==true)
          {
                return ;
          }
          //因为默认数组中都是false 所以访问一个变一个 
          
          visted [key]=true;
          
          List<int> suroudkey=graph[key];//找出当前key的所有相连节点
          //开始遍历相连的key 因为是一个列表 都存着数 就直接遍历就行
          foreach(int nextkey in suroudkey )
          {
              Dfs(graph,nextkey,visted);
          }
      }
      
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

登陆页面渗透测试常见的20种思路与总结

【渗透测试】16个实用谷歌浏览器插件分享 飞雪网络安全人才培养计划&#xff0c;绝对零区&#xff0c;公益教学&#xff01; 思路总结 1、之前是否已经留过后门&#xff0c;是&#xff0c;直接getshell&#xff0c;否&#xff0c;进行测试 2、SQL注入&万能密码&#xf…

qt QWebSocketServer详解

1、概述 QWebSocketServer 是 Qt 框架中用于处理 WebSocket 服务器端的类。它允许开发者创建 WebSocket 服务器&#xff0c;接受客户端的连接&#xff0c;并与之进行双向通信。WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议&#xff0c;它使得客户端和服务器之间的数…

Vue.js 事件处理器

Vue.js 事件处理器 Vue.js 是一个流行的前端框架,它提供了一种简洁而高效的方式来处理前端应用程序中的事件。事件处理器是 Vue.js 中一个核心概念,它允许开发者监听和响应 DOM 事件。在本文中,我们将深入探讨 Vue.js 事件处理器的各个方面,包括基本用法、修饰符、自定义事…

掌握分布式系统的38个核心概念

天天说分布式分布式&#xff0c;那么我们是否知道什么是分布式&#xff0c;分布式会遇到什么问题&#xff0c;有哪些理论支撑&#xff0c;有哪些经典的应对方案&#xff0c;业界是如何设计并保证分布式系统的高可用呢&#xff1f; 1. 架构设计 这一节将从一些经典的开源系统架…

中小跨境卖家如何选择物流?

跨境物流作为电商交易的核心环节&#xff0c;其复杂性和多变性对卖家来说不言而喻。本文将为您详细解析跨境物流的七大流程、常见物流测评以及推荐的工具&#xff0c;帮助您在激烈的市场竞争中把握物流优势&#xff0c;提升业务效率和客户满意度。 跨境物流七大流程 1. 启运国出…

6大国有银行软开的薪资待遇清单

牛客上刷到一条关于计算机专业值得去的银行软开清单,其中对 6 大国有银行软开的薪资待遇分析我觉得很有必要同步给大家看一看。 截图信息来自牛客的漫长白日梦 其中邮储软开是最值得推荐的(offer 投票没输过),二线城市转正后第一个完整年的收入在 30 万左右,一线城市更高…

我们来学mysql -- EXPLAIN之ID(原理篇)

EXPLAIN之ID 题记ID 题记 2024美国大选已定&#xff0c;川普剑登上铁王座&#xff0c;在此过程中出谋划策的幕僚很重要&#xff0c;是他们决定了最终的执行计划在《查询成本之索引选择》中提到&#xff0c;explain的输出&#xff0c;就是优化器&#xff08;幕僚&#xff09;选…

【网络安全】X-Forwarded-For漏洞成因及防范

文章目录 获取客户端IP背景如何获取客户端 IPIP 伪造防范 IP 伪造方法一:Nginx 配置方法二:Tomcat 的 RemoteIpValve方法三:Egg.js 的 maxProxyCount获取客户端IP背景 分布式拒绝服务攻击(DDoS)和频繁请求的爬虫行为属于异常请求,通过分析 IP 地址可以检测出这些异常行为…

蓝桥杯-网络安全比赛题目-遗漏的压缩包

小蓝同学给你发来了他自己开发的网站链接&#xff0c; 他说他故意留下了一个压缩包文件&#xff0c;里面有网站的源代码&#xff0c; 他想考验一下你的网络安全技能。 &#xff08;点击“下发赛题”后&#xff0c;你将得到一个http链接。如果该链接自动跳转到https&#xff0c;…

新疆高校大数据实验室案例分享

高校大数据实验室建设&#xff0c;企业可以提供技术支持、实训平台和项目案例&#xff0c;高校则提供科研和教学资源&#xff0c;实现产学研一体化。不仅有利于大数据技术的应用和人才培养也有利于区域发展。 泰迪与新疆合作的院校包括新疆大学、昌吉学院等 新疆大…

关于Flutter空安全升级方案整理

前言 Flutter 从 2.0 版本开始支持空安全&#xff08;Null Safety&#xff09;。dart 版本为&#xff1a; environment:sdk: ">2.12.0 < 3.0.0"升级到空安全后&#xff0c;由于语法的变动&#xff0c;基本上整个工程&#xff0c;代码都爆红&#xff0c;这对项…

干货 | 2024年数据要素白皮书(免费下载)

导读&#xff1a;白皮书在对比分析国际数据领域发展现状的基础上&#xff0c;围绕数据要素市场化配置改革这一主线&#xff0c;从数据高质量供给、数据创新应用、体制机制建设、产业探索方向四大方面展现了数据要素发展过程中&#xff0c;各类主体的新作为、新成效&#xff0c;…

RTT 内核基础学习

RT-Thread 内核介绍 内核是操作系统的核心&#xff0c;负责管理系统的线程、线程间通信、系统时钟、中断以及内存等。 内核位于硬件层之上&#xff0c;内核部分包括内核库、实时内核实现。 内核库是为了保证内核能够独立运行的一套小型的类似C库的函数实现子集。 这部分根据编…

发送/取消告警消息到nVisual接口详解

接口描述&#xff1a;发送/取消告警事件消息到nVisual系统 URL地址&#xff1a;http://ip:port/wapi/v1/notice 访问方法&#xff1a;POST 请求参数&#xff1a; Body参数 参数名类型示例值必填titleString端口告警是contentString端口光功率告警是userIdLong94000000000045…

六通道CAN集线器(协议型)

一、功能概述 SG_CanHub_600 是一款具有六路通道的工业级智能 CAN 数字隔离中继集线器。 SG_CanHub_600 能够实现信号再生、延长通信距离、提高总线负载能力、匹配不同速 率 CAN 网络&#xff0c;同时强大的 ID过滤功能可以极大降低 CAN 总线负荷&#xff0c;并具有故障指…

Web应用性能测试工具 - httpstat

在数字化时代&#xff0c;网站的性能直接影响用户体验和业务成功。你是否曾经在浏览网页时&#xff0c;遇到加载缓慢的困扰&#xff1f;在这个快速变化的互联网环境中&#xff0c;如何快速诊断和优化Web应用的性能呢&#xff1f;今天&#xff0c;我们将探讨一个强大的工具——h…

代码中的设计模式-策略模式

假如我们有一段代码,有很多的if else function executeAction(type) {if (type A) {console.log(Action A);} else if (type B) {console.log(Action B);} else if (type C) {console.log(Action C);} else {console.log(Unknown action);} }executeAction(A); // 输出: Ac…

【Linux】从零开始使用多路转接IO --- 理解EPOLL的 LT水平触发模式 与 ET边缘触发模式

当你偶尔发现语言变得无力时&#xff0c; 不妨安静下来&#xff0c; 让沉默替你发声。 --- 里则林 --- 从零开始认识多路转接 1 EPOLL优缺点2 EPOLL工作模式 1 EPOLL优缺点 poll 的优点(和 select 的缺点对应) 接口使用方便&#xff1a;虽然拆分成了三个函数&#xff0c;…

kafka+zookeeper的搭建

kafka从2.8版本开始&#xff0c;就可以不用配置zookeeper了&#xff0c;但是也可以继续配置。我目前使用的kafka版本是kafka_2.12-3.0.0.tgz&#xff0c;其中前面的2.12表示是使用该版本的scala语言进行编写的&#xff0c;而后面的3.00才是kafka当前的版本。 通过百度网盘分享…

基础数据结构——队列(链表实现)

队列的性质 先进先出&#xff08;FIFO - First In First Out&#xff09;&#xff1a;最先加入队列的元素最先被移出后进后出&#xff08;后来的元素排在队尾&#xff09;只允许在队尾插入元素&#xff0c;在队首删除元素具有先来先服务的特点 链表实现队列 和之前创建链表相…