代码随想录——图论

1、所有可能的路径

代码随想录——图论_第1张图片

代码随想录——图论_第2张图片

将输入的graph展开就如下图所示,可以用回溯法求得从0点到4的所有路径。

代码随想录——图论_第3张图片

class Solution {
    vector> result;
    vector array;
public:
    void DFS(vector>& graph,int cur,int target)
    {
        //如果当前层为第n-1节点对应的数组,则直接保存结果返回
        if(cur==target)
        {
            result.push_back(array);
            return;
        }
        //否则就按照正常回溯做就行
        for(int i=0;i> allPathsSourceTarget(vector>& graph) {
    //注意0需要提前压入数组
    array.push_back(0);
    DFS(graph,0,graph.size()-1);
    return result;
    }
};

2、钥匙和房间

代码随想录——图论_第4张图片

 代码随想录——图论_第5张图片

1.遇到已经遍历过的层需要直接跳过,已经打开过的门,不会再被关上,所以没有回溯后需要复原的变量;
2.对于已经遍历过的层(节点)用一个数组做好标记。最后遍历整个数组看是否还有没有遍历的节点。

//关键在于,已经打开过的门,不会再被关上,所以没有回溯后需要复原的变量
class Solution {
    vector array;
public:
    void DFS(vector>& rooms,int cur)
    {
        //对于当前层进行遍历
        for(int i=0;i>& rooms) {
    array=vector(rooms.size(),false);
    array[0]=true;//第一层(节点)默认打开
    DFS(rooms,0);
    //遍历做好标记的数组,看是否所有的层(节点)都开过门
    for(int i=0;i

3、单词接龙

代码随想录——图论_第6张图片

4、岛屿数量

代码随想录——图论_第7张图片

class Solution {
public:
    void searchOne(vector>& grid, int i, int j)
    {
        grid[i][j]='0';
        if(i+1=0&&grid[i-1][j]=='1')
        {
            searchOne(grid, i-1, j);
        }
        if(j+1=0&&grid[i][j-1]=='1')
        {
            searchOne(grid, i, j-1);
        }
    }
    //关键的关键,一旦判断位陆地,则用完就将他编程海洋
    int numIslands(vector>& grid) {
        int count=0;
        for(int i=0;i

参考代码随想录

你可能感兴趣的:(代码随想录,图论,深度优先,算法)