首页 > 编程语言 >代码随想录算法训练营第 50 天 |98. 所有可达路径

代码随想录算法训练营第 50 天 |98. 所有可达路径

时间:2024-08-23 15:27:57浏览次数:12  
标签:连通 int 路径 随想录 50 98 link 搜索 节点

代码随想录算法训练营

Day50 代码随想录算法训练营第 50 天 |98. 所有可达路径


目录


前言

LeetCode98. 所有可达路径

讲解文档


一、图论基础概念

1、图的种类

整体上一般分为 有向图 和 无向图

2、度

(1)无向图中有几条边连接该节点,该节点就有几度
(2)在有向图中,每个节点有出度和入度。

出度:从该节点出发的边的个数。

入度:指向该节点边的个数。

例如,该有向图中,节点3的入度为2,出度为1,节点1的入度为0,出度为2

3、连通性:节点的连通情况

(1)连通图
在无向图中,任何两个节点都是可以到达的的图为连通图
(如果有节点不能到达其他节点,则为非连通图)
(2)强连通图
在有向图中,任何两个节点是可以相互到达的为强连通图
(3)连通分量
在无向图中的极大连通子图称之为该图的一个连通分量
(4) 强连通分量
在有向图中极大强连通子图称之为该图的强连通分量
代码随想录-强连通分量 代码随想录-强连通分量

  • 节点1、节点2、节点3、节点4、节点5 构成的子图是强连通分量,因为这是强连通图,也是极大图。

  • 节点6、节点7、节点8 构成的子图 不是强连通分量,因为这不是强连通图,节点8 不能达到节点6。

  • 节点1、节点2、节点5 构成的子图 也不是 强连通分量,因为这不是极大图-

4、图的构造

(1)邻接矩阵

邻接矩阵 使用 二维数组来表示图结构。 邻接矩阵是从节点的角度来表示图,有多少节点就申请多大的二维数组
例如:
有向图:grid[2][5] = 6 表示 节点2 指向 节点5,边的权值为6
无向图:grid[2][5] = 6,grid[5][2] = 6,表示节点2 与 节点5 相互连通,权值为6
(2)邻接表
邻接表 使用 数组 + 链表的方式来表示。 邻接表是从边的数量来表示图,有多少边 才会申请对应大小的链表
代码随想录-邻接表代码随想录-邻接表

  • 节点1 指向 节点3 和 节点5
  • 节点2 指向 节点4、节点3、节点5
  • 节点3 指向 节点4
  • 节点4指向节点1

5、图的遍历方式

(在邻接表或邻接矩阵上进行搜索)
(1)深度优先搜索(dfs)–递归实现
(2) 广度优先搜索(bfs)

二、深度优先搜索

1、深度优先搜索的三部曲

(1)确认递归函数,参数
深搜需要 二维数组数组结构保存所有路径,需要一维数组保存单一路径,可以定义一个全局变量,避免函数参数过多
(2)确认终止条件
(3) 处理目前搜索节点出发的路径
一个for循环的操作,去遍 目前搜索节点所能到的所有节点;
加入路径,递归调用,弹出

2、深度优先搜索框架

void dfs(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本节点所连接的其他节点) {
        处理节点;
        dfs(图,选择的节点); // 递归
        回溯,撤销处理结果
    }
}


三、LeetCode98. 所有可达路径

1.题目链接

LeetCode98. 所有可达路径

2.思路

(1)存图:
link[i][k]=1:指的是有i指向k的路径
(2)深度优先搜索
1)返回值:void
参数:终点,遍历到第几个点(当前点的下标),存图的数组
2)终止条件
当前遍历点下标等于终点下标
3)处理目前搜索节点出发的路径
① 遍历当前节点(下标i)对应的link[i]数组,如果link[i][k]等于1,那么i–>k路径存在
② k加入路径
③ k进行递归调用
④ k弹出路径

3.题解

#include<bits/stdc++.h>
using namespace std;
vector<vector<int>>ans ;
vector<int>path;

void dfs(int i,int n,vector<vector<int>>link)
{
    if(i==n)
    {
        ans.push_back(path);
        return ;
    }
    for(int k=1;k<=n;k++)
    {   
        if(link[i][k])
        {
            path.push_back(k);
            dfs(k,n,link);
            path.pop_back();
        }
    }
    
}
int main()
{
    int n;
    int m;
    int t1;
    int t2;
    cin>>n>>m;
    vector<vector<int>>link(n+1,vector<int>(n+1,0));
    //下标表示的点所连接的点的集合
    for(int i=0;i<m;i++)
    {
        
        cin>>t1>>t2;
      
        link[t1][t2]=1;//t1--->t2
    }
    path.push_back(1);
    dfs(1,n,link);
   
    int l=ans.size();
    if(l==0)
    {
        cout<<-1<<"\n";
    }else
    {
        for(int i=0;i<l;i++)
        {
            int r=ans[i].size();
            for(int j=0;j<r;j++)
            {
                cout<<ans[i][j];
                if(j<r-1)cout<<" ";
                if(j==r-1)cout<<"\n";
            }
        }
    }
    
    return 0;
    
}

总结

标签:连通,int,路径,随想录,50,98,link,搜索,节点
From: https://blog.csdn.net/2301_79647020/article/details/141458582

相关文章

  • 代码随想录算法训练营第 51 天 |LeetCode99岛屿数量 LeetCode100.岛屿的最大面积
    代码随想录算法训练营Day51代码随想录算法训练营第51天|LeetCode99岛屿数量LeetCode100.岛屿的最大面积目录代码随想录算法训练营前言LeetCode200岛屿数量LCR105.岛屿的最大面积一、广度优先搜索基础1、用队列实现2、代码框架:二、卡码网99岛屿数量(LeetCode......
  • 代码随想录算法训练营第 49 天 |LeetCode42 接雨水 LeetCode84 柱状图中最大面积矩形
    代码随想录算法训练营Day49代码随想录算法训练营第49天|LeetCode42接雨水LeetCode84柱状图中最大面积矩形目录代码随想录算法训练营前言LeetCode42接雨水LeetCode84柱状图中最大面积矩形一、LeetCode42接雨水1.题目链接2.思路3.题解二、LeetCode84柱状......
  • 代码随想录算法训练营第 48 天 |LeetCode 739. 每日温度 LeetCode496.下一个更大元素
    代码随想录算法训练营Day48代码随想录算法训练营第48天|LeetCode739.每日温度LeetCode496.下一个更大元素ILeetCode503.下一个更大元素II目录代码随想录算法训练营前言LeetCode739.每日温度LeetCode496.下一个更大元素ILeetCode503.下一个更大元素II一......
  • 24暑假算法刷题 | Day39 | 动态规划 VII | LeetCode 198. 打家劫舍,213. 打家劫舍 II,33
    目录198.打家劫舍题目描述题解213.打家劫舍II题目描述题解337.打家劫舍III题目描述题解打家劫舍的一天......
  • 代码随想录day 38 || 322 零钱兑换,279 完全平方数,139 单词拆分
    322零钱找还funccoinChange(coins[]int,amountint)int{ //装满,并且硬币无限,可以类比完全背包问题 //dp[i][j]表示前i个物品装满容量为j的背包所需要的最少物品数量 //递推公式dp[i][j]=min(dp[i-1][j],dp[i][j-w(i)]+1)//不装物品i的物品数量,装物品i的物品数......
  • 代码随想录DAY22 - 回溯算法 - 08/21
    目录理论回顾什么是回溯法回溯法的效率回溯法解决的问题如何理解回溯组合题干思路和代码递归法递归优化:剪枝组合总和Ⅲ题干思路和代码递归法递归优化电话号码的字母组合题干思路和代码递归法理论回顾什么是回溯法回溯是一种类似枚举的搜索方法,回溯和......
  • 代码随想录DAY23 - 回溯算法 - 08/22
    组合总和题干题目:给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合。candidates中的同一个数字可以无限制重复被选取。如果至少......
  • 代码随想录算法训练营第二十三天(回溯 二)
    力扣题部分:39.组合总和题目链接:.-力扣(LeetCode)题面:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candid......
  • 代码随想录算法训练营第二十二天(回溯 一)
    开始学习回溯!回溯理论基础代码随想录文章链接:代码随想录文章摘要:什么是回溯法回溯法也可以叫做回溯搜索法,它是一种搜索的方式。在二叉树系列中,我们已经不止一次,提到了回溯。回溯是递归的副产品,只要有递归就会有回溯。所以以下讲解中,回溯函数也就是递归函数,指的都是一......
  • 代码随想录Day23
    131.分割回文串给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]示例2:输入:s="a"输出:[["a"]]提示:1<=s.length<=16s仅由......