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

dfs写法,邻接矩阵写法:

#include <vector> 
#include <iostream>
using namespace std;

vector<int> path;
vector<vector<int>> res;

void dfs(const vector<vector<int>>& graph , int x ,int n)
{
    if(x == n)
    {
        res.push_back(path);
        return;
    }
    
    for(int i = 1 ; i <= n ; i++)
    {
        if(graph[x][i] == 1)//找到x到i的路径
        {
            path.push_back(i);
            dfs(graph,i,n);
            path.pop_back();
        }
    }
}



int main()
{
    int n,m,s,j;
    cin >> n >> m;
    vector<vector<int>> graph(n+1,vector<int>(n+1,0));
    
    while(m--)
    {
        cin >> s >> j;
        graph[s][j] = 1;
    }
    
    path.push_back(1);
    dfs(graph,1,n);
    
    if(res.size() == 0) cout <<-1<<endl;
    
    for(const vector<int>& i : res)
    {
        for(int j = 0; j < i.size() - 1; ++j)
        {
            cout <<i[j]<<" ";
        }
        cout<< i[i.size() - 1]<<endl;
    }
}

邻接表写法:
 

#include <vector> 
#include <iostream>
#include <list>
using namespace std;

vector<int> path;
vector<vector<int>> res;

void dfs(const vector<list<int>>& graph , int x ,int n)
{
    if(x == n)
    {
        res.push_back(path);
        return;
    }
    
    for(int i : graph[x])
    {//找到x到i的路径
        path.push_back(i);
        dfs(graph,i,n);
        path.pop_back();
    }
}



int main()
{
    int n,m,s,j;
    cin >> n >> m;
    vector<list<int>> graph(n+1);
    
    while(m--)
    {
        cin >> s >> j;
        graph[s].push_back(j);
    }
    
    path.push_back(1);
    dfs(graph,1,n);
    
    if(res.size() == 0) cout <<-1<<endl;
    
    for(const vector<int>& i : res)
    {
        for(int j = 0; j < i.size() - 1; ++j)
        {
            cout <<i[j]<<" ";
        }
        cout<< i[i.size() - 1]<<endl;
    }
}

797. 所有可能的路径

给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序

 graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。

示例 1:

输入:graph = [[1,2],[3],[3],[]]
输出:[[0,1,3],[0,2,3]]
解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3

class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;

    void dfs(const vector<vector<int>>& graph,int start, int end)
    {
        if(start == end) 
        {
            res.push_back(path);
            return ;
        }

        for(int i : graph[start])
        {
            path.push_back(i);
            dfs(graph,i,end);
            path.pop_back();
        }
    }


    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) 
    {
        path.clear();
        res.clear();
        path.push_back(0);
        dfs(graph,0,graph.size() -1 );
        return res;
    }
};

每写出来看的别人的


class Solution {
public:
    int minimumOperations(string num) {
       //个人分析
       //贪心算法 可以看作 从最大长度  找顺序组合 然后看是否是特殊数据
       int n=num.size();
       int ans=0; //操作次数

       //如何处理字符串? 将其转化为整数型
       //能被25整除
       //分为一下情况 00 25 50 75 0 全删去 总共六种 //可以分类讨论 0 就是只剩下一个0
       bool find0=false,find5=false;
       for(int i=n-1;i>=0;i--){
        if(num[i]=='0' || num[i]=='5'){
            if(find0==true)
                return n-i-2; //-i表示去除i之前的个数 -2 表示减去两个数 剩下的就是要删除的数目
            if(num[i]=='0')
                find0=true;
            else{
                find5=true;
            }

        }
        else if(num[i]=='2' || num[i]=='7'){
            if(find5==true)
                return n-i-2;
        }
       }
        if(find0==true)
            return n-1;//只剩一个0
        return n;//全删   
    }
};

代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值