BFS,DFS程序(c++)

本文深入探讨了广度优先搜索(BFS)和深度优先搜索(DFS)算法的应用,包括层序遍历、无权最短路径求解、图中无闭环节点查找等核心问题。通过具体实例和代码解析,帮助读者理解这两种算法的工作原理和实现细节。
  • 一个报错:缺少非空判断,或者你写错了对空指针操作了。如:if(!p)...//空指针操作了姐们
leetcode报错:member access within null pointer of type 'struct ListNode'
  • 一维指针可以指向二维数组
int *p;
int a[2][2];
p=&a[1][1];
or
*p=a[1][1];
  • queue&vector
queue
q.push()  //进
q.pop()
vector
v.push_back()
v.pop_back()

 

 

 

BFS

遍历

BFS遍历->层序遍历->无权最短路径  https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/bfs-de-shi-yong-chang-jing-zong-jie-ceng-xu-bian-l/详解

层序遍历:层序遍历扫描完一行后,下一行从上一行第一个开始寻找,需要添加队列辅助。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 利用d
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> vec;
        vector<int> b;
        queue<TreeNode *> q;
        int i,cnt,zov=1;
        TreeNode *t=root;
        if(!root)return vec;
        q.push(root);
        t=root;
        while(!q.empty())  //非NULL
        {
            for(i=0;i<zov;i++)  //每一层
            {
                t=q.front();
                b.push_back(t->val);
                q.pop();
                if(t->left)  //非NULL
                {
                    q.push(t->left);
                    cnt++;
                }
                if(t->right)
                {
                    q.push(t->right);
                    cnt++;
                }
            }
            vec.push_back(b);
            b.clear();
            zov=cnt;   //cnt记录每层非NULL的节点数
            cnt=0;
        }
        return vec;
    }
};

无权网络BFS遍历

void BFS_shortest()
{
 	int i,j,cnt=1,t,zoc=2;
 	queue<int>q;
 	for(i=0;i<N;i++)
 		for(j=0;j<N;j++)
 		{
 			a[i][j]=0;
		}
	a[2][2]=cnt;
	q.push(2);
	q.push(2);
	while(!q.empty())
	{
		cnt++;
		for(t=0;t<zoc/2;t++)
		{
			i=q.front();
			q.pop();
			j=q.front();
			q.pop();
			if(i+1<N&&a[i+1][j]==0)
			{
				a[i+1][j]=cnt;
				q.push(i+1);
				q.push(j);
			}
			if(i>0&&a[i-1][j]==0)
			{
				a[i-1][j]=cnt;
				q.push(i-1);
				q.push(j);
			}
			if(j+1<N&&a[i][j+1]==0)
			{
				a[i][j+1]=cnt;
				q.push(i);
				q.push(j+1);
			}
			if(j>0&&a[i][j-1]==0)
			{
				a[i][j-1]=cnt;
				q.push(i);
				q.push(j-1);
			}
		}	
		zoc=q.size();
	}
}
int main()

多启动BFS

leetcode1162地图分析问题

class Solution {
public:
    int maxDistance(vector<vector<int>>& grid) {
        int N=grid.size();
        int i,j,cnt=1,t;  //cnt初始1下列代表距离是2的实际距离为1,和land是1冲突,下面cnt掌握好
        do
        {
            t=0;               
            for(i=0;i<N;i++)
                for(j=0;j<N;j++)
                {
                    if(grid[i][j]==cnt)  //检测到距离为n的点
                    {
                        cout<<cnt<<':';
                        if(i+1<N&&grid[i+1][j]==0)
                        {
                            grid[i+1][j]=cnt+1;
                            t++;
                            cout<<'1';
                        }
                        if(i>0&&grid[i-1][j]==0)
                        {
                            grid[i-1][j]=cnt+1;
                            t++;
                            cout<<'2';
                        }
                        if(j+1<N&&grid[i][j+1]==0)
                        {
                            grid[i][j+1]=cnt+1;
                            t++;
                            cout<<'3';
                        }
                        if(j>0&&grid[i][j-1]==0)
                        {
                            grid[i][j-1]=cnt+1;
                            t++;
                        }
                        cout<<endl;
                     }
                }
            cnt++;
        }while(t);
        if(cnt==2)return -1;
        return cnt-2;
    }
};

DFS

第802题,找图中没有闭环的节点,这题,让我深刻体会到&传递的速度,前三次都是形参漏了&,导致一直超时

/*
找没有环的节点,采用深度优先搜索
//形参传递vector时漏了个&,一直超出时间限制,&确实快!
*/
class Solution {
public:
    vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
        int len,j=0,i=0;
        len=graph.size();
        int flag=1;
        vector<int> a,circle(len,0);        //vector<int> qi(i,0);
        while(i<len)
        {
                if(DFS(graph,i,circle)==0)  // 1.2.下一个节点,3.当前node。4.初始节点
                a.push_back(i);
                i++;
        }
        return a;
    }
    int DFS(vector<vector<int>>& graph,int node,vector<int>& circle)  //漏了个&,&确实快!
    {
        int next_node,num=0;    //每次递归是个新的node,0起始;有return的node才是非0
        if(graph[node].size()==0) return 0; //这条线没环!||//剪枝,这点没环
 //*****if(circle[node]==1)  return -1;//这个点有环  ...放下方while里进入递归前判断
        circle[node]=1;  //访问了当前节点
        while(num<graph[node].size())
        {
            next_node=graph[node][num++] ;  //next_node=graph[node][num]
            if(circle[next_node]==2)continue;
            if(circle[next_node]==1||DFS(graph,next_node,circle)==-1)  
                return -1;      //这个点有环,下方殃及上方
        }
        circle[node]=2;   //这个点没环!
        return 0;

    }
};

 

<think>好的,用户想了解如何在C++中实现BFSDFS算法。首先,我需要回忆这两种算法的基本概念和它们的应用场景。根据提供的引用内容,BFS适合最短路径和层次遍历,而DFS适合深入探索和寻找全部解。接下来,我应该先解释两者的区别,然后给出具体的实现步骤和代码示例。 接下来,我需要确保代码的正确性。对于BFS,通常使用队列,从起始节点开始,逐层访问相邻节点。记得要标记已访问的节点,避免重复访问。DFS的话,可以用递归或者栈来实现,这里可能选择递归方式更直观,但要注意栈溢出的风险,不过对于教学示例,递归应该没问题。 然后,考虑到用户可能需要实际应用的例子,我应该提供一个图的表示方法,比如邻接表,并展示如何在这个图上运行BFSDFS。这样用户可以看到完整的流程,包括图的构建和算法的调用。 另外,用户可能会混淆这两种算法的应用场景,所以需要明确指出何时选择BFSDFS,比如引用中的内容提到BFS找最短路径,DFS适合全部解的情况。这些点需要强调,帮助用户做出正确的选择。 最后,生成相关问题时要围绕实现细节、性能比较和应用场景,确保问题能够帮助用户进一步理解和应用这两种算法。同时,检查引用标记是否正确,确保引用的内容与用户提供的资料一致。</think>### C++中BFSDFS的实现 #### 1. 广度优先搜索(BFS) **核心思想**:逐层遍历所有节点,利用队列实现。适用于最短路径、状态搜索等场景[^1][^2]。 **实现步骤**: 1. 创建队列和访问标记数组 2. 将起始节点入队并标记 3. 循环处理队列直到为空: - 取出队首节点 - 处理当前节点 - 将未访问的相邻节点入队并标记 **代码示例**: ```cpp #include <queue> #include <vector> void BFS(int start, const std::vector<std::vector<int>>& graph) { std::vector<bool> visited(graph.size(), false); std::queue<int> q; q.push(start); visited[start] = true; while (!q.empty()) { int current = q.front(); q.pop(); // 处理当前节点(例如打印) std::cout << current << " "; for (int neighbor : graph[current]) { if (!visited[neighbor]) { q.push(neighbor); visited[neighbor] = true; } } } } ``` #### 2. 深度优先搜索(DFS) **核心思想**:沿着分支深入探索到底,使用递归或栈实现。适合拓扑排序、路径探索等场景[^1][^2]。 **实现步骤**: 1. 创建访问标记数组 2. 递归访问节点: - 处理当前节点 - 标记为已访问 - 递归访问未访问的相邻节点 **代码示例**: ```cpp #include <vector> void DFS_Recursive(int node, const std::vector<std::vector<int>>& graph, std::vector<bool>& visited) { visited[node] = true; std::cout << node << " "; // 处理当前节点 for (int neighbor : graph[node]) { if (!visited[neighbor]) { DFS_Recursive(neighbor, graph, visited); } } } // 调用入口 void DFS(int start, const std::vector<std::vector<int>>& graph) { std::vector<bool> visited(graph.size(), false); DFS_Recursive(start, graph, visited); } ``` #### 3. 应用示例 **图的邻接表表示**: ```cpp /* 0 -> 1, 2 1 -> 3 2 -> 3 3 -> */ std::vector<std::vector<int>> graph = { {1, 2}, // 节点0的邻居 {3}, // 节点1的邻居 {3}, // 节点2的邻居 {} // 节点3的邻居 }; // 执行BFS BFS(0, graph); // 输出: 0 1 2 3 // 执行DFS DFS(0, graph); // 输出: 0 1 3 2 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值