代码随想录算法训练营 | 图论 | DFS

98. 所有可达路径// DFS

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

vector<vector<int>> result;
vector<int> path;

void dfs(const vector<list<int>> &graph, int i, int target) {
  if (i == target) {
    result.push_back(path);
    return;
  }
  for (int nums : graph[i]) {
    path.push_back(nums);
    dfs(graph, nums, target);
    path.pop_back();
  }
}

int main() {
  int n, m;
  cin >> n >> m;
  vector<list<int>> graph(n + 1);
  int temp, next;
  for (int i = 0; i < m; i++) {
    cin >> temp >> next;
    graph[temp].push_back(next);
  }
  path.push_back(1);
  dfs(graph, 1, n);
  if (result.size() == 0)
    cout<<-1<<endl;
  for (int i = 0; i < result.size(); i++) {
    for (int j = 0; j < result[i].size() - 1; j++) {
      cout << result[i][j] << " ";
    }
    cout << result[i][result[i].size() - 1] << endl;
  }
}

99. 岛屿数量//。。感觉这题没必要拘泥于用什么搜索。。

复制代码
#include<bits/stdc++.h>
using namespace std;


void DFSfindsameIsland(vector<vector<bool>>& finded,const vector<vector<int>>& graph,int a,int b){
    if(a<0||b<0||a>graph.size()-1||b>graph[a].size()-1) return;
    else if(graph[a][b]==0) return;
    else if(graph[a][b]==1){
        if(finded[a][b]==false){
            finded[a][b]=true;
            DFSfindsameIsland(finded,graph,a,b+1);
            DFSfindsameIsland(finded,graph,a+1,b);
            DFSfindsameIsland(finded,graph,a,b-1);
            DFSfindsameIsland(finded,graph,a-1,b); 
        }
        else return;
    }
}
int main(){
    int i,j;
    cin>>i>>j;
    vector<vector<int>> graph(i,vector<int> (j));
    for(int a=0;a<i;a++){
        for(int b=0;b<j;b++){
            cin>>graph[a][b];
        }
    }
    vector<vector<bool>> finded(i,vector<bool> (j,false));
    int result=0;
    for(int a=0;a<i;a++){
        for(int b=0;b<j;b++){
            if(graph[a][b]==1&&!finded[a][b]){
                result++;
                DFSfindsameIsland(finded,graph,a,b);
            }  
        }
    }
    cout<<result<<endl;     
}

100. 岛屿的最大面积//偷懒了。随便拿上一题的代码改改就交了

复制代码
#include<bits/stdc++.h>
using namespace std;


int DFSfindsameIsland(vector<vector<bool>>& finded,const vector<vector<int>>& graph,int a,int b){
    if(a<0||b<0||a>graph.size()-1||b>graph[a].size()-1) return 0;
    else if(graph[a][b]==0) return 0;
    else{
        if(finded[a][b]==false){
            int result=1;
            finded[a][b]=true;
            result+=DFSfindsameIsland(finded,graph,a,b+1);
            result+=DFSfindsameIsland(finded,graph,a+1,b);
            result+=DFSfindsameIsland(finded,graph,a,b-1);
            result+=DFSfindsameIsland(finded,graph,a-1,b);
            return result;
        }
        else return 0;
    }
}
int main(){
    int i,j;
    cin>>i>>j;
    vector<vector<int>> graph(i,vector<int> (j));
    for(int a=0;a<i;a++){
        for(int b=0;b<j;b++){
            cin>>graph[a][b];
        }
    }
    vector<vector<bool>> finded(i,vector<bool> (j,false));
    int result=0;int maxaera=0;
    for(int a=0;a<i;a++){
        for(int b=0;b<j;b++){
            if(graph[a][b]==1&&!finded[a][b]){
                maxaera=max(maxaera,DFSfindsameIsland(finded,graph,a,b));
            }  
        }
    }
    cout<<maxaera<<endl;     
}
相关推荐
PPPPPaPeR.20 分钟前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法
看我干嘛!24 分钟前
python第五次作业
算法
历程里程碑29 分钟前
Linux 库
java·linux·运维·服务器·数据结构·c++·算法
Sheep Shaun31 分钟前
如何让一个进程诞生、工作、终止并等待回收?——探索Linux进程控制与Shell的诞生
linux·服务器·数据结构·c++·算法·shell·进程控制
Pluchon32 分钟前
硅基计划4.0 简单模拟实现AVL树&红黑树
java·数据结构·算法
生锈的键盘42 分钟前
推荐算法实践:交叉特征的理解
算法
乌萨奇也要立志学C++1 小时前
【洛谷】BFS 求解最短路:从马的遍历到迷宫问题的实战解析
算法·宽度优先
老鼠只爱大米1 小时前
LeetCode经典算法面试题 #46:全排列(回溯、交换、剪枝等五种实现方案详细解析)
算法·leetcode·剪枝·回溯·全排列·stj算法
Dovis(誓平步青云)1 小时前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
_OP_CHEN2 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc