林老师 · 客观题题库 · 专题 06 图论基础与遍历 · 复习强化

专题 06 图论基础与遍历 · 复习强化

100 题 · 每题对应一个知识细节 · 全部原创
真题
复刻
试卷编号ORIG-专题06图论基础与遍历-复习强化
题目总数108 题 · 100 分
试卷类型客观题
考生须知:
① 本卷共 10 大部分,合计 108 题 · 100 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 100 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

图的概念与度

13 QUESTIONS · 2 POINTS EACH
第 1 题 A1 未作答

GG 由哪两部分组成( )。

(1 分)
第 2 题 A2 未作答

存图时执行 add(1, 2) 只在 11 号顶点的邻接表里加入了 22。这样存出的图中"1122 有边,2211 未必有边",该图是( )。

(1 分)
第 3 题 A3 未作答

无向图 GG 中,顶点 33 与顶点 112255 各有一条边相连,再无其他边与 33 相连。顶点 33 的度是( )。

(1 分)
第 4 题 A4 未作答

有向图的边为 121 \to 2131 \to 3242 \to 4343 \to 4。顶点 44 的入度和出度分别是( )。

(1 分)
第 5 题 A5 未作答

一个无向图有 66 个顶点,各顶点的度依次为 332222113333。该图的边数是( )。

(1 分)
第 6 题 A6 未作答

一个有向图有 88 条边。所有顶点的入度之和、所有顶点的出度之和分别是( )。

(1 分)
第 7 题 A7 未作答

无向图中顶点 vv 上画了一个自环,另外还有 22 条普通边连着 vv。顶点 vv 的度是( )。

(1 分)
第 8 题 A8 未作答

55 个顶点的无向完全图(每两个顶点之间恰有一条边)共有多少条边( )。

(1 分)
第 9 题 A9 未作答

下列关于路径的说法正确的是( )。

(1 分)
第 10 题 A10 未作答

无向图的边为 (3,4)(3,4)(4,5)(4,5)(5,3)(5,3)。顶点序列 3,4,5,33, 4, 5, 3 构成( )。

(1 分)
第 11 题 A11 未作答

77 个顶点的无向图,边为 (1,2)(1,2)(2,3)(2,3)(5,6)(5,6)。该图的连通分量个数是( )。

(1 分)
第 12 题 A12 未作答

1010 个顶点的无向图至少应该有多少条边,才能确保它是一个连通图( )。

(1 分)
第 13 题 A13 未作答

一个 88 个顶点、1212 条边的无向连通图,至少要删去多少条边才能变成一棵树( )。

(1 分)

邻接矩阵

10 QUESTIONS · 2 POINTS EACH
第 14 题 B1 未作答

阅读下面的程序:

01int g[10][10] = {};
02g[1][2] = 1; g[2][1] = 1;
03g[2][3] = 1; g[3][2] = 1;
04cout << g[1][3];

程序的输出是( )。

(1 分)
第 15 题 B2 未作答

用邻接矩阵 gg 存无向图。关于矩阵元素的关系,正确的是( )。

(1 分)
第 16 题 B3 未作答

int g[1000][1000]10001000 个顶点的邻接矩阵,该数组占用的内存约为( )。

(1 分)
第 17 题 B4 未作答

用邻接矩阵存图,判断顶点 uuvv 之间是否有直接边,所需时间是( )。

(1 分)
第 18 题 B5 未作答

NN 个顶点构成的有向连通图,用邻接矩阵表示时,该矩阵中至少存在多少个非零元素( )。

(1 分)
第 19 题 B6 未作答

用邻接矩阵存 55 个顶点(编号 151 \sim 5)的无向图,矩阵如下(行、列都按 151 \sim 5 编号):

0 1 0 1 0
1 0 1 0 0
0 1 0 0 1
1 0 0 0 1
0 0 1 1 0

顶点 22 的度是( )。

(1 分)
第 20 题 B7 未作答

用邻接矩阵存有向图,程序如下:

01int s = 0;
02for (int i = 1; i <= n; ++i)
03    s += g[i][v];

变量 s 最终是( )。

(1 分)
第 21 题 B8 未作答

无向图中顶点 22 有一个自环。用邻接矩阵存图后,用"第 22 行元素之和"计算顶点 22 的度,得到的结果会( )。

(1 分)
第 22 题 B9 未作答

用邻接矩阵存边权均为正整数的带权无向图,无边的位置填 00。若读出 g[u][v]=0g[u][v] = 0,可以断定( )。

(1 分)
第 23 题 B10 未作答

要存一个 n=105n = 10^5m=5×104m = 5 \times 10^4 的无向图(边数远小于 n2n^2)。最合适的存储方式是( )。

(1 分)

邻接表与存图代码

12 QUESTIONS · 2 POINTS EACH
第 24 题 C1 未作答

阅读建图代码:

01vector<int> g[100];
02void add(int u, int v) { g[u].push_back(v); }

g[u] 存放的是( )。

(1 分)
第 25 题 C2 未作答

void add(int u, int v) { g[u].push_back(v); } 存一条无向边 (1,2)(1, 2),只执行了 add(1, 2)。为了正确表示无向边,还必须执行( )。

(1 分)
第 26 题 C3 未作答

无向图有 66 条边(无自环、无重边),用 vector 邻接表按标准写法存图,所有 g[u] 里的元素总数是( )。

(1 分)
第 27 题 C4 未作答

用邻接表把图遍历一遍:外层 for 枚举每个顶点,内层枚举其邻接表。总时间复杂度是( )(nn 为顶点数、mm 为边数)。

(1 分)
第 28 题 C5 未作答

邻接表建图后执行:

01for (int v : g[u])
02    cout << v << " ";

依次输出的是( )。

(1 分)
第 29 题 C6 未作答

无向图按标准写法加边 add(1,2)add(1,3)add(4,1)(每条都加正反两次)。此时 g[1].size() 是( )。

(1 分)
第 30 题 C7 未作答

用邻接表存图,判断"uuvv 之间是否有直接边",需要扫一遍 g[u],时间是( )。

(1 分)
第 31 题 C8 未作答

阅读链式前向星代码:

01int head[100], nxt[200], to[200], cnt = 0;
02void add(int u, int v) {
03    to[++cnt] = v;
04    nxt[cnt] = head[u];
05    head[u] = cnt;
06}

数组 to[cnt] 存放的是( )。

(1 分)
第 32 题 C9 未作答

链式前向星加边函数:

01int head[100], nxt[200], to[200], cnt = 0;
02void add(int u, int v) {
03    to[++cnt] = v;
04    nxt[cnt] = head[u];
05    head[u] = cnt;
06}

依次执行 add(1, 2)add(1, 3)add(1, 4),然后从 head[1] 开始沿 nxt 链枚举邻居,得到的顺序是( )。

(1 分)
第 33 题 C10 未作答

链式前向星中,head[] 数组通常初始化为 1-1 而不是 00,原因是( )。

(1 分)
第 34 题 C11 未作答

用边集数组 struct Edge { int u, v; } e[M]; 存图。它最适合的场景是( )。

(1 分)
第 35 题 C12 未作答

图有 n=500n = 500 个顶点,最多 m=105m = 10^5 条边,程序需要频繁判断"任意两点 uuvv 之间是否有直接边"。最合适的存储是( )。

(1 分)

深度优先遍历 DFS

15 QUESTIONS · 2 POINTS EACH
第 36 题 D1 未作答

阅读 DFS 程序:

01void dfs(int u) {
02    vis[u] = true;
03    cout << u << " ";
04    for (int v : g[u])
05        if (!vis[v]) dfs(v);
06}

第一行 vis[u] = true; 的作用是( )。

(1 分)
第 37 题 D2 未作答

无向图有 44 个顶点、44 条边:(1,2)(1,2)(1,3)(1,3)(2,4)(2,4)(3,4)(3,4)。用 vector 邻接表按题目给出的顺序加边(每条边正反各加一次),从 11 号点开始 DFS。访问顺序是( )。

(1 分)
第 38 题 D3 未作答

同一张无向图(44 点、边 (1,2)(1,2)(1,3)(1,3)(2,4)(2,4)(3,4)(3,4))分别用两种方式存:

  • 方式一:邻接表加边顺序为 (1,3)(1,3)(1,2)(1,2)(2,4)(2,4)(3,4)(3,4)
  • 方式二:邻接矩阵(枚举邻居时按编号从小到大)。

两种方式都从 11 开始 DFS,得到的访问序分别是( )。

(1 分)
第 39 题 D4 未作答

同一张连通无向图,从同一起点出发做 DFS,两次运行得到了不同的访问顺序。最可能的原因是( )。

(1 分)
第 40 题 D5 未作答

无向图有 55 个顶点,边为 (a,b)(a,b)(a,c)(a,c)(b,d)(b,d)(c,d)(c,d)(d,e)(d,e)。以 aa 为起点做深度优先遍历(枚举邻居的顺序任意),bbccddee 四个点中,有可能作为最后一个被遍历到的点的个数是( )。

(1 分)
第 41 题 D6 未作答

要对一张非连通图的所有顶点做 DFS,主程序如下:

01int comp = 0;
02for (int u = 1; u <= n; ++u)
03    if (!vis[u]) {
04        comp++;
05        ____________;
06    }

空缺处应填( )。

(1 分)
第 42 题 D7 未作答

要统计一张图的连通分量个数,下列说法正确的是( )。

(1 分)
第 43 题 D8 未作答

程序从顶点 11 开始 DFS,全局变量 cnt 在每个顶点被访问时加 11。DFS 结束后判断整张图是否连通,条件是( )。

(1 分)
第 44 题 D9 未作答

从顶点 uu 出发做了一次 DFS。DFS 结束后 vis[v]true,可以断定( )。

(1 分)
第 45 题 D10 未作答

用显式栈代替递归做 DFS:弹出栈顶 uu、访问它,然后把 uu 的未访问邻居压栈。为了让访问顺序与"递归 DFS(邻居按 1,2,31, 2, 3 的顺序枚举)"一致,压栈时应( )。

(1 分)
第 46 题 D11 未作答

55 个顶点的链形无向图:123451-2-3-4-5(只有这 44 条边)。从 11 开始递归 DFS,递归最深时调用栈中同时有几个 dfs 函数帧( )。

(1 分)
第 47 题 D12 未作答

用邻接表存图(nn 个顶点、mm 条边)做一次完整 DFS,时间复杂度是( )。

(1 分)
第 48 题 D13 未作答

改用邻接矩阵存同一张图(nn 个顶点)做 DFS,每个顶点出边时要扫描矩阵的一整行。时间复杂度是( )。

(1 分)
第 49 题 D14 未作答

nn 个顶点的连通无向图做 DFS,全部 nn 个点都被访问。整个过程中"沿着它走到新顶点"的边(树边)共有多少条( )。

(1 分)
第 50 题 D15 未作答

有向图有 33 个顶点,边为 121 \to 2232 \to 3313 \to 1。把 DFS 代码中的 vis[u] = true; 一行删掉,从 11 开始递归 DFS,程序会( )。

(1 分)

广度优先遍历 BFS

15 QUESTIONS · 2 POINTS EACH
第 51 题 E1 未作答

阅读 BFS 程序:

01queue<int> q;
02q.push(s); vis[s] = true;
03while (!q.empty()) {
04    int u = q.front(); q.pop();
05    for (int v : g[u])
06        if (!vis[v]) {
07            vis[v] = true;      // 甲
08            q.push(v);
09        }
10}

注释"甲"处的标记时机是( )。

(1 分)
第 52 题 E2 未作答

把标准 BFS(入队时标记)改成"出队时才标记":把邻居 q.push(v)标记,顶点出队之后才执行标记。无向图边为 (s,a)(s,a)(s,b)(s,b)(a,b)(a,b),从 ss 开始 BFS。顶点 bb 会被入队几次( )。

(1 分)
第 53 题 E3 未作答

无向图有 44 个顶点、44 条边:(1,2)(1,2)(1,3)(1,3)(2,4)(2,4)(3,4)(3,4)。邻接表按题目给出的顺序加边,从 11 号点开始 BFS。访问顺序(出队顺序)是( )。

(1 分)
第 54 题 E4 未作答

无向图有 44 个顶点、44 条边:(1,2)(1,2)(1,3)(1,3)(2,4)(2,4)(3,4)(3,4)。从 11 做 BFS,与起点距离为 22(最少经过 22 条边)的顶点集合是( )。

(1 分)
第 55 题 E5 未作答

BFS 只用一个 dist 数组、不另设 vis 数组:dist[s] = 0 表示起点,其余位置初始化为 1-1。初始化为 1-1(而不是 00)的原因是( )。

(1 分)
第 56 题 E6 未作答

BFS 程序片段:

01int u = q.front(); q.pop();
02for (int v : g[u])
03    if (dist[v] == -1) {
04        dist[v] = dist[u] + 1;
05        q.push(v);
06    }

新发现的邻居 vv 的距离是在什么时刻、由谁推出来的( )。

(1 分)
第 57 题 E7 未作答

无向图有 55 个顶点,边为 (1,2)(1,2)(1,3)(1,3)(2,4)(2,4)(3,5)(3,5)(4,5)(4,5)。从 11 开始 BFS,dist[5] 的值是( )。

(1 分)
第 58 题 E8 未作答

无权图(或所有边权相同)中,求从 sstt 的最少边数路径,应该用( )。

(1 分)
第 59 题 E9 未作答

"用 BFS 求出的步数一定是最短步数"成立的前提是( )。

(1 分)
第 60 题 E10 未作答

BFS 求得 dist[t] = 3sstt 的最少边数)。这条最短路径一共经过多少个顶点( )。

(1 分)
第 61 题 E11 未作答

BFS 时在入队处记录 pre[v] = uvv 是从 uu 第一次发现并入队的)。找到 tt 后沿 pre 链从 tt 走回 ss,得到的是倒序的路径,所以输出前要( )。

(1 分)
第 62 题 E12 未作答

多源 BFS 把所有起点先全部入队并标记(dist00),再开始普通扩展。这样求出的 dist[v] 是( )。

(1 分)
第 63 题 E13 未作答

ss 做 BFS 后,dist 数组中的最大值为 33。这个 33 的含义是( )。

(1 分)
第 64 题 E14 未作答

关于 DFS 和 BFS 的对比,正确的是( )。

(1 分)
第 65 题 E15 未作答

无向图边为 (1,2)(1,2)(1,3)(1,3)(2,4)(2,4)(3,4)(3,4),邻接表按给出顺序加边(11 的邻居先 2233)。从 11 出发分别做 DFS 和 BFS,两个访问序列的第二个访问的顶点分别是( )。

(1 分)

网格图与泛洪

13 QUESTIONS · 2 POINTS EACH
第 66 题 F1 未作答

把一张 RRCC 列的迷宫看成图:能走的格子是顶点。那么"图中的边"对应的是( )。

(1 分)
第 67 题 F2 未作答

网格 DFS 常用方向数组:

01int dx[4] = {-1, 1, 0, 0};
02int dy[4] = {0, 0, -1, 1};

i = 0 时,(r + dx[0], c + dy[0]) 是哪个格子( )。

(1 分)
第 68 题 F3 未作答

网格泛洪程序:

01int nr = r + dx[i], nc = c + dy[i];
02if (____________ && grid[nr][nc] == old)
03    flood(nr, nc);

空缺处应填(设网格 RRCC 列,下标从 00 开始)( )。

(1 分)
第 69 题 F4 未作答

88 方向连通中,处于网格内部的格子 (r,c)(r, c) 的邻居个数是( )。

(1 分)
第 70 题 F5 未作答

统计网格中目标格连通块个数的程序框架:

01int cnt = 0;
02for (int r = 0; r < R; ++r)
03    for (int c = 0; c < C; ++c)
04        if (grid[r][c] == 1 && !vis[r][c]) {
05            flood(r, c);
06            cnt++;
07        }

cnt++ 放在 flood 之后的含义是( )。

(1 分)
第 71 题 F6 未作答

44 方向连通下,下面网格(1 是目标格)中最大连通块的大小是( )。

1 1 0 0
0 1 0 1
1 0 0 1
1 1 1 1

(1 分)
第 72 题 F7 未作答

把网格中与起点同色连通的区域全部染成新色的泛洪程序:

01void fill(int r, int c, char old, char nw) {
02    queue<pair<int,int>> q;
03    q.push({r, c}); grid[r][c] = nw;
04    while (!q.empty()) {
05        auto t = q.front(); q.pop();
06        for (int i = 0; i < 4; ++i) {
07            int nr = t.first + dx[i], nc = t.second + dy[i];
08            if (inborder(nr, nc) && grid[nr][nc] == ______)
09                { grid[nr][nc] = nw; q.push({nr, nc}); }
10        }
11    }
12}

空缺处应填( )。

(1 分)
第 73 题 F8 未作答

泛洪染色程序的扩展片段:

01int nr = t.first + dx[i], nc = t.second + dy[i];
02if (inborder(nr, nc) && grid[nr][nc] == old) {
03    grid[nr][nc] = nw;
04    q.push({nr, nc});
05}

其中 grid[nr][nc] = nw; 写在 q.push({nr, nc}); 之前而不是之后,作用是( )。

(1 分)
第 74 题 F9 未作答

用"直接把格子改成新色"代替 vis 数组来防止重复访问。这种写法的前提是( )。

(1 分)
第 75 题 F10 未作答

RRCC 列网格的格子编号成一维(行优先):id = r * C + c。在 55 列的网格中,第 22 行第 33 列(下标从 00 起)的格子编号是( )。

(1 分)
第 76 题 F11 未作答

# 表示岛屿、. 表示海水,44 方向连通。下面地图中共有岛屿(连通块)几个( )。

# . # #
. . # .
# . . #
# . # #

(1 分)
第 77 题 F12 未作答

RRCC 列的网格做一次完整的多连通块泛洪统计(每个格子至多被入队、访问一次),时间复杂度是( )。

(1 分)
第 78 题 F13 未作答

1×51 \times 5 的网格为 S . . S .S 是源点,. 是空格)。所有源点同时入队(距离 00)开始 BFS,则从左到右 55 个格子的距离依次是( )。

(1 分)

回溯

11 QUESTIONS · 2 POINTS EACH
第 79 题 G1 未作答

回溯法中反复出现"恢复现场"这个词。它指的是( )。

(1 分)
第 80 题 G2 未作答

生成 1n1 \sim n 全排列的程序:

01void perm(int k) {              // 已选了 k 个数
02    if (k == n) { output(); return; }
03    for (int i = 1; i <= n; ++i)
04        if (!vis[i]) {
05            vis[i] = true; a[k] = i;
06            perm(k + 1);
07            ____________;
08        }
09}

空缺处应填( )。

(1 分)
第 81 题 G3 未作答

生成 1n1 \sim n 全排列的程序(vis 标记数组、a 存当前排列):

01void perm(int k) {
02    if (k == n) { output(); return; }
03    for (int i = 1; i <= n; ++i)
04        if (!vis[i]) { vis[i] = true; a[k] = i; perm(k + 1); vis[i] = false; }
05}

n=3n = 3for 循环按 i=1,2,3i = 1, 2, 3 的顺序尝试时,程序第二个输出的排列是( )。

(1 分)
第 82 题 G4 未作答

另一种全排列写法:

01void perm(int k) {
02    if (k == n) { output(); return; }
03    for (int i = k; i <= n; ++i) {
04        swap(a[k], a[i]);
05        perm(k + 1);
06        swap(a[k], a[i]);
07    }
08}

紧随递归调用的第二次交换,作用是( )。

(1 分)
第 83 题 G5 未作答

回溯的每一层由三步组成。正确的执行顺序是( )。

(1 分)
第 84 题 G6 未作答

枚举 nn 个元素所有子集的回溯:每个元素有"选"和"不选"两个分支,到第 nn 层输出。n=3n = 3 时输出总共执行多少次( )。

(1 分)
第 85 题 G7 未作答

枚举组合(从 1n1 \sim n 中选 mm 个数)的回溯:

01void comb(int start, int k) {
02    if (k == m) { output(); return; }
03    for (int i = start; i <= n; ++i) {
04        c[k] = i;
05        comb(i + 1, k + 1);
06    }
07}

参数 start(下一层从比刚选的数更大的编号开始试)的本质作用是( )。

(1 分)
第 86 题 G8 未作答

n=3n = 3 的全排列回溯树:根节点是"还没选任何数",每个节点表示一种部分排列,叶子是完整排列。整棵树(含根与叶)的节点总数是( )。

(1 分)
第 87 题 G9 未作答

用回溯生成长度为 44 的合法括号序列(22 对括号),规则:可以放左括号当已放左括号数小于 22;可以放右括号当已放右括号数小于已放左括号数。能生成的序列个数是( )。

(1 分)
第 88 题 G10 未作答

把第 80 题全排列程序中空缺的那一行忘写(即只标记、从不撤销)。n=3n = 3 时程序总共输出几个排列( )。

(1 分)
第 89 题 G11 未作答

阅读程序片段(dfs 内的循环体):

01for (int i = 1; i < n; ++i) {
02    // 甲:把 d 数组中第 i-1 段与第 i 段合并成一段
03    dfs(n - 1, sum + s);       // 乙
04    // 丙:把 d 数组恢复成合并前的样子
05}

这段程序在做的事情是( )。

(1 分)

剪枝与搜索优化

6 QUESTIONS · 2 POINTS EACH
第 90 题 H1 未作答

从若干正整数中选一些数使和恰好等于 tt。搜索时若当前已选数之和已经大于 tt,直接 return 不再往下选。这种剪枝剪掉的是( )。

(1 分)
第 91 题 H2 未作答

搜索求"选物品的最大总价值"时维护当前最优答案 ans。若当前价值加上剩余物品价值总和仍然不超过 ans,就剪掉该分支。这里的"剩余总和"用来( )。

(1 分)
第 92 题 H3 未作答

拼凑目标值时先把候选数排序再搜索(例如从大到小试)。关于这一步,正确的是( )。

(1 分)
第 93 题 H4 未作答

枚举排列时候选数里有两个相等的数(如两个 22)。当前位已经试过第一个 22 并回溯后,遇到第二个 22 应该直接跳过,原因是( )。

(1 分)
第 94 题 H5 未作答

搜索求最大和,累加的数可能全为负数。把答案变量初始化为 ans = 0 会( )。

(1 分)
第 95 题 H6 未作答

阅读程序(题意为:nn 个数对排成一行,每步选相邻两段合并成一段,代价与两段有关;程序枚举所有合并顺序求最大总代价):

01void dfs(int n, int sum) {
02    if (n == 1) { ans = max(sum, ans); return; }
03    for (int i = 1; i < n; ++i) {
04        int a = d[i-1][0], b = d[i-1][1];
05        int x = d[i][0],  y = d[i][1];
06        // 合并:两段变成一段 (a+x, b+y),其余前移
07        int s = a + x + abs(b - y);
08        dfs(n - 1, sum + s);
09        // 恢复 d 数组
10    }
11}

输入 n=2n = 2,两个数对为 (5,3)(5, 3)(7,1)(7, 1)。程序输出 ans 是( )。

(1 分)

易错排查

5 QUESTIONS · 2 POINTS EACH
第 96 题 I1 未作答

某同学写的 BFS 在大图上队列膨胀到几十万个元素、内存暴涨。最可能的原因是( )。

(1 分)
第 97 题 I2 未作答

存无向边 (1,2)(1, 2) 时只执行了 add(1, 2),忘了 add(2, 1)。从 22 号点开始 DFS(图只有这一条边),能访问到的顶点个数是( )。

(1 分)
第 98 题 I3 未作答

链式前向星约定:边从 11 开始编号,head[u]uu 的第一条边号、无出边时为 1-1,遍历写 for (int i = head[u]; i != -1; i = nxt[i])(顶点编号从 11 开始)。某同学建图后从 11 号点遍历,程序访问了不存在的 00 号顶点并反复输出 00。最可能的 bug 是( )。

(1 分)
第 99 题 I4 未作答

网格代码写成:

01if (grid[nr][nc] == '.' && 0 <= nr && nr < R && 0 <= nc && nc < C)

nrnc 越界时,这个条件的问题是( )。

(1 分)
第 100 题 I5 未作答

10510^5 个顶点的链形图(1231051-2-3-\cdots-10^5)上从端点递归 DFS,程序崩溃。原因与对策是( )。

(1 分)

真 题 演 练

8 QUESTIONS · 真题演练不计分
第 1 题 单选 未作答

1010 个顶点的无向图至少应该有( )条边才能确保是一个连通图。

(0 分)
CSP-J 2020 · 单选 第8题 | 知识点 图的基本概念
第 104~109 题 阅读程序 (共 0 分) 未作答

1  #include <algorithm>
2  #include <iostream>
3  using namespace std;
4 
5  int n;
6  int d[50][2];
7  int ans;
8 
9  void dfs(int n, int sum) {
10      if (n == 1) {
11          ans = max(sum, ans);
12          return;
13      }
14      for (int i = 1; i < n; ++i) {
15          int a = d[i - 1][0], b = d[i - 1][1];
16          int x = d[i][0], y = d[i][1];
17          d[i - 1][0] = a + x;
18          d[i - 1][1] = b + y;
19          for (int j = i; j < n - 1; ++j)
20              d[j][0] = d[j + 1][0], d[j][1] = d[j + 1][1];
21          int s = a + x + abs(b - y);
22          dfs(n - 1, sum + s);
23          for (int j = n - 1; j > i; --j)
24              d[j][0] = d[j - 1][0], d[j][1] = d[j - 1][1];
25          d[i - 1][0] = a, d[i - 1][1] = b;
26          d[i][0] = x, d[i][1] = y;
27      }
28  }
29 
30  int main() {
31      cin >> n;
32      for (int i = 0; i < n; ++i)
33          cin >> d[i][0];
34      for (int i = 0; i < n; ++i)
35          cin >> d[i][1];
36      ans = 0;
37      dfs(n, 0);
38      cout << ans << endl;
39      return 0;
40  }

假设输入的 nn 是不超过 5050 的正整数,d[i][0]d[i][1] 都是不超过 1000010000 的正整数,完成下面的判断题和单选题。

104.

若输入 nn00,此程序可能会死循环或发生运行错误。( )

105.

若输入 nn2020,接下来的输入全为 00,则输出为 00。( )

106.

输出的数一定不小于输入的 d[i][0]d[i][1] 的任意一个。( )

107.

若输入的 nn2020,接下来的输入是 202099202000,则输出为( )。

108.

若输入的 nn3030,接下来的输入是 303000303055,则输出为( )。

109.

若输入的 nn1515,接下来的输入是 151511,以及 151511,则输出为( )。

CSP-J 2020 · 阅读程序 第28-33题 | 知识点 深度优先搜索、回溯、二维数组
第 8 题 单选 未作答

对于有 nn 个顶点、mm 条边的无向连通图 (m>nm > n),需要删掉( )条边才能使其成为一棵树。

(0 分)
CSP-J 2021 · 单选 第6题 | 知识点 图的基本概念
第 9 题 单选 未作答

a 为起点,对右边的无向图进行深度优先遍历,则 bcde 四个点中有可能作为最后一个遍历到的点的个数为( )。

(0 分)
CSP-J 2021 · 单选 第14题 | 知识点 图的DFS遍历、深度优先搜索
第 10 题 单选 未作答

考虑由 N 个顶点构成的有向连通图,采用邻接矩阵的数据结构表示时,该矩阵中至少存在( )个非零元素。

(0 分)
CSP-J 2022 · 单选 第9题 | 知识点 邻接矩阵、图的基本概念
第 117~121 题 完善程序 (共 0 分) 未作答

试补全程序。

1  #include <bits/stdc++.h>
2  using namespace std;
3 
4  const int ROWS = 8;
5  const int COLS = 8;
6 
7  struct Point {
8    int r, c;
9    Point(int r, int c) : r(r), c(c) {}
10  };
11 
12  bool is_valid(char image[ROWS][COLS], Point pt,
13                  int prev_color, int new_color) {
14    int r = pt.r;
15    int c = pt.c;
16    return (0 <= r && r < ROWS && 0 <= c && c < COLS &&
17            ① && image[r][c] != new_color);
18  }
19 
20  void flood_fill(char image[ROWS][COLS], Point cur, int new_color) {
21    queue<Point> queue;
22    queue.push(cur);
23 
24    int prev_color = image[cur.r][cur.c];
25    ②;
26 
27    while (!queue.empty()) {
28      Point pt = queue.front();
29      queue.pop();
30 
31      Point points[4] = {③, Point(pt.r - 1, pt.c),
32                          Point(pt.r, pt.c + 1), Point(pt.r, pt.c - 1)};
33      for (auto p : points) {
34        if (is_valid(image, p, prev_color, new_color)) {
35          ④;
36          ⑤;
37        }
38      }
39    }
40  }
41 
42  int main() {
43    char image[ROWS][COLS] = {{'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g'},
44                                {'g', 'g', 'g', 'g', 'g', 'g', 'r', 'r'},
45                                {'g', 'r', 'r', 'g', 'g', 'r', 'g', 'g'},
46                                {'g', 'b', 'b', 'b', 'b', 'r', 'g', 'r'},
47                                {'g', 'g', 'g', 'b', 'b', 'r', 'g', 'r'},
48                                {'g', 'g', 'g', 'b', 'b', 'b', 'b', 'r'},
49                                {'g', 'g', 'g', 'g', 'g', 'b', 'g', 'g'},
50                               {'g', 'g', 'g', 'g', 'g', 'b', 'b', 'g'}};
51 
52    Point cur(4, 4);
53    char new_color = 'y';
54 
55    flood_fill(image, cur, new_color);
56 
57    for (int r = 0; r < ROWS; r++) {
58      for (int c = 0; c < COLS; c++) {
59        cout << image[r][c] << " ";
60      }
61      cout << endl;
62    }
63    // 输出:
64    // g g g g g g g g
65    // g g g g g g r r
66    // g r r g g r g g
67    // g y y y y r g r
68    // g g g y y r g r
69    // g g g y y y y r
70    // g g g g g y g g
71    // g g g g g y y g
72 
73    return 0;
74  }

117.

①处应填( )

118.

②处应填( )

119.

③处应填( )

120.

④处应填( )

121.

⑤处应填( )

CSP-J 2022 · 完善程序 第40-44题 | 知识点 泛洪算法、广度优先搜索、队列
第 16 题 单选 未作答

在无向图中,所有顶点的度数之和等于( )。

(0 分)
CSP-J 2024 · 单选 第11题 | 知识点 邻接矩阵、邻接表
第 17 题 单选 未作答

在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和,这个总和等于?( )

(0 分)
CSP-J 2025 · 单选 第5题 | 知识点 邻接矩阵、邻接表