UVa 280 Vertex ( dfs搜索 水题 )

本文介绍了一个简单的有向图深度优先搜索(DFS)遍历算法实现案例。通过C++代码展示了如何进行DFS遍历,包括节点的访问标记、递归调用等关键步骤。适用于初学者理解DFS的基本原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有向图搜索,水题

代码:

#include <cstdio>
#include <cstring>

const int N = 110;
int n, g[N][N], vn;
bool vis[N];

void dfs( int x ) {
    for ( int i = 1; i <= n; ++i ) 
        if ( !vis[i] && g[x][i] ) {
            vis[i] = true;
            vn--;
            dfs(i);
        }
}
int main()
{
    while ( scanf("%d", &n) != EOF && n ) {
        int i, j, num;
        memset( g, 0, sizeof(g) );
        while ( scanf("%d", &i), i ) 
            while ( scanf("%d", &j) , j ) g[i][j] = 1;
        scanf("%d", &num);
        while ( num-- ) {
            int st;
            vn = n;
            scanf("%d", &st);
            memset( vis, 0, sizeof(vis) );
            dfs( st );
            printf("%d", vn);
            for ( int i = 1; i <= n; ++i ) if ( !vis[i] ) printf(" %d", i);
            printf("\n");
        }
    }
}


### DFS 和 BFS 算法练习推荐 对于准备华为公司面试中的深度优先搜索 (DFS) 和广度优先搜索 (BFS) 算法,以下是几道经典的练习以及一些实用建议。 #### 经典目推荐 1. **岛屿数量** - 描述:给定一个由 '0'()和 '1'(陆地)组成的二维网格,计算其中有多少个独立的岛屿。可以通过修改输入矩阵来标记访问过的节点。 - 方法:可以采用 DFS 或者 BFS 来遍历每一个未被访问的土地单元格 ('1') 并将其连通区域全部置为已访问状态('2'),每完成一次这样的操作就计数加一表示发现了一个新的岛屿[^1]。 2. **课程表 II** - 描述:存在 n 门不同编号的课程,某些课程可能有前置条件依赖关系。给出这些先修课的要求列表 [[ai, bi]] 表明想要学习 ai 必须先学完 bi 。返回一种有效的选课顺序;如果不存在则返回空数组。 - 方法:此问本质上是一个拓扑排序的问,适合用 Kahn's Algorithm 实现基于入度统计的 BFS 版本解决路径重建版本的问[^2]。 3. **最小基因变化** - 描述:起始于某个起点字符串 startGene ,目标到达终点 endGene 的最短转换序列长度是多少?每次只允许改变一个字符,并且中间结果也必须存在于 bank[] 中。 - 方法:利用双向 BFS 可以有效地减少搜索空间从而加快求解速度,在遇到对方方向已经扩展到当前层时即找到了一条连接两端的最佳路径[^3]。 4. **单词接龙** - 描述:从字典中找到一系列连续变换使得初始单词能够逐步变成最终的目标单词,每一次仅限更改单个字母形成的新词需属于所提供的词汇集合内。 - 方法:同样适用双端队列实现优化版的 BFS 进行逐级扩散直到触及目的位置为止[^4]。 ```python from collections import deque def bfs_shortest_path(graph, start, goal): queue = deque([(start, [start])]) while queue: vertex, path = queue.popleft() for next_node in graph[vertex]: if next_node == goal: return path + [next_node] elif next_node not in set(path): queue.append((next_node, path + [next_node])) return None ``` 5. **二叉树的最大深度** - 描述:获取一棵 N 叉树的高度/层数信息。 - 方法:通过递归形式定义 dfs 函数来进行自底向上累加高度值的方式很容易理解并编写代码实现。 ```python class TreeNode(object): def __init__(self, val=0, children=None): self.val = val self.children = children or [] def maxDepth(root: 'TreeNode'): if root is None: return 0 depth = 0 stack = [(root, 1)] while stack: node, current_depth = stack.pop() depth = max(depth, current_depth) for child in node.children: stack.append((child, current_depth + 1)) return depth ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值