DFS和BFS遍历

int n;     		//结点个数
int mp[N][N]; 	//邻接矩阵
int vis[N];		//记录此顶点是否遍历过;

DFS

void DFS(int x)
{
    int i;
    countt++;
    if(countt==1)
    printf("%d",x);
    else
        printf(" %d",x);
    for(i=0;i<n;i++)  //遍历所有顶点
    {
        if(vis[i]==0&&mp[x][i]==1)
        {
            vis[i]=1;
            DFS(i);
        }
    }
}

BFS
队列思想,和层序遍历差不多

void BFS(int x)
{
    int i;
    queue <int>Q;
    vis[x]=1;
    Q.push(x);
    int countt=0;
    while(!Q.empty())
    {
        int f=Q.front();
        countt++;
        if(countt==1)
        printf("%d",f);
        else
            printf(" %d",f);
        Q.pop();
        for(i=0;i<n;i++)
        {
            if(vis[i]==0&&mp[f][i]==1)
            {
                Q.push(i);
                vis[i]=1;
            }
        }
    }
}
图的深度优先搜索(DFS)和广度优先搜索(BFS)是两种常见的图遍历算法。 假设我们有一个无向图,其中边用边列表表示如下: ``` edges = [(0, 1), (0, 2), (1, 2), (2, 0), (2, 3), (3, 3)] ``` 其中每个元素表示一条边,例如 `(0, 1)` 表示节点 `0` 和节点 `1` 之间有一条边。 ### DFS DFS 通过递归地访问每个节点及其邻居来遍历图。具体实现如下: ```python # 图的深度优先搜索 def dfs(graph, start): # visited 用于记录已经访问的节点 visited = set() # 进行递归访问 def traverse(node): visited.add(node) print(node, end=' ') for neighbor in graph[node]: if neighbor not in visited: traverse(neighbor) traverse(start) ``` 在上面的代码中,我们首先定义了一个 `visited` 集合,用于记录已经访问的节点。然后我们定义了一个内部函数 `traverse(node)`,它会递归访问每个节点及其邻居。在递归访问每个节点时,我们首先将其添加到 `visited` 集合中,然后打印出节点的值,并递归访问其未被访问过的邻居。 我们可以使用以下代码调用 `dfs` 函数,以从节点 `2` 开始遍历图: ```python # 测试 DFS graph = {0: [1, 2], 1: [2], 2: [0, 3], 3: [3]} dfs(graph, 2) ``` 输出如下: ``` 2 0 1 3 ``` ### BFS BFS 通过先访问起点节点,然后逐层访问其邻居节点来遍历图。具体实现如下: ```python # 图的广度优先搜索 def bfs(graph, start): # visited 用于记录已经访问的节点 visited = set() # 使用队列进行遍历 queue = [start] visited.add(start) while queue: node = queue.pop(0) print(node, end=' ') for neighbor in graph[node]: if neighbor not in visited: visited.add(neighbor) queue.append(neighbor) ``` 在上面的代码中,我们首先定义了一个 `visited` 集合和一个队列 `queue`,用于记录已经访问的节点和待访问的节点。然后我们将起点节点添加到队列中,并将其标记为已访问。在接下来的循环中,我们不断从队列中取出一个节点,并打印出其值,然后逐个访问其未被访问过的邻居节点,并将其添加到队列中,同时将其标记为已访问。 我们可以使用以下代码调用 `bfs` 函数,以从节点 `2` 开始遍历图: ```python # 测试 BFS graph = {0: [1, 2], 1: [2], 2: [0, 3], 3: [3]} bfs(graph, 2) ``` 输出如下: ``` 2 0 3 1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值