烟台市网站建设_网站建设公司_测试工程师_seo优化
2026/1/16 2:22:38 网站建设 项目流程

2025年3月GESP真题及题解(C++七级): 图上移动

题目描述

小 A 有一张包含n nn个结点与m mm条边的无向图,结点以1 , 2 , … , n 1, 2, \dots, n1,2,,n标号。小 A 会从图上选择一个结点作为起点,每一步移动到某个与当前小 A 所在结点相邻的结点。对于每个结点i ii1 ≤ i ≤ n 1 \leq i \leq n1in),小 A 想知道从结点i ii出发恰好移动1 , 2 , … , k 1, 2, \dots, k1,2,,k步之后,小 A 可能会位于哪些结点。由于满足条件的结点可能有很多,你只需要求出这些结点的数量。

输入格式

第一行,三个正整数n , m , k n, m, kn,m,k,分别表示无向图的结点数与边数,最多移动的步数。

接下来m mm行,每行两个正整数u i , v i u_i, v_iui,vi,表示图中的一条连接结点u i u_iuiv i v_ivi的无向边。

输出格式

n nn行,第i ii行 (1 ≤ i ≤ n 1 \leq i \leq n1in) 包含k kk个整数,第j jj个整数 (1 ≤ j ≤ k 1 \leq j \leq k1jk) 表示从结点i ii出发恰好移动j jj步之后可能位置的结点数量。

输入输出样例 1
输入 1
4 4 3 1 2 1 3 2 3 3 4
输出 1
2 4 4 2 4 4 3 3 4 1 3 3
说明/提示

对于20 % 20\%20%的测试点,保证k = 1 k = 1k=1

对于另外20 % 20\%20%的测试点,保证1 ≤ n ≤ 50 , 1 ≤ m ≤ 50 1 \leq n \leq 50, 1 \leq m \leq 501n50,1m50

对于所有测试点,保证1 ≤ n ≤ 500 , 1 ≤ m ≤ 500 , 1 ≤ k ≤ 20 , 1 ≤ u i , v i ≤ n 1 \leq n \leq 500, 1 \leq m \leq 500, 1 \leq k \leq 20, 1 \leq u_i, v_i \leq n1n500,1m500,1k20,1ui,vin

思路分析

本题要求计算从每个结点出发,恰好移动 1 到 k 步后可能到达的不同结点数量。由于 k 较小(≤20),可以采用动态规划方法对每个起点单独计算。

对于每个起点 s:

  • 定义状态dp[j][v]表示从 s 出发恰好 j 步能否到达结点 v。
  • 初始状态:dp[0][s] = true,其余为 false。
  • 状态转移:对于步数 j 从 1 到 k,遍历每条边 (u, v),若dp[j-1][u]为 true,则dp[j][v]置为 true;同理,若dp[j-1][v]为 true,则dp[j][u]置为 true。因为是无向图,每条边可以双向行走。
  • 最终对于每个 j,统计dp[j][v]中 true 的数量即为答案。

时间复杂度:共 n 个起点,每个起点进行 k 轮转移,每轮遍历 m 条边,总复杂度 O(n * k * m),在题目数据范围(n,m ≤ 500, k ≤ 20)下完全可行。

代码实现

#include<iostream>#include<cstring>usingnamespacestd;constintMAXN=505;// 最大结点数constintMAXK=25;// 最大步数+5constintMAXM=505;// 最大边数booldp[MAXK][MAXN];// dp[步数][结点]:从当前起点出发恰好j步能否到达该结点pair<int,int>edges[MAXM];// 存储所有边intmain(){intn,m,k;cin>>n>>m>>k;// 读入边for(inti=0;i<m;i++){intu,v;cin>>u>>v;edges[i]={u,v};// 存为pair方便使用}// 对每个起点分别计算for(intstart=1;start<=n;start++){// 初始化dp数组为falsememset(dp,0,sizeof(dp));// 0步时只能到达起点自身dp[0][start]=true;// 动态规划:计算恰好j步的可达性for(intj=1;j<=k;j++){// 遍历每条边进行转移for(inti=0;i<m;i++){intu=edges[i].first,v=edges[i].second;// 如果上一步能到达u,则这一步可以通过边(u,v)到达vif(dp[j-1][u]){dp[j][v]=true;}// 无向图,反向同理if(dp[j-1][v]){dp[j][u]=true;}}}// 输出结果:对于每个步数j,统计可达结点数量for(intj=1;j<=k;j++){intcnt=0;for(intv=1;v<=n;v++){if(dp[j][v])cnt++;}cout<<cnt;if(j<k)cout<<" ";// 行内空格分隔}cout<<endl;// 换行进入下一个起点}return0;}

功能分析

  1. 输入处理

    • 读取结点数 n、边数 m 和最大步数 k。
    • 存储 m 条无向边。
  2. 核心计算

    • 外层循环遍历每个起点 start(1 到 n)。
    • 对每个起点,使用二维布尔数组 dp 记录可达性。
    • 动态规划过程模拟了所有可能的移动路径(允许重复访问结点和边)。
    • 通过遍历所有边进行状态转移,确保考虑所有可能的移动。
  3. 输出结果

    • 对每个起点,输出 k 个整数,分别表示移动 1 到 k 步后可能位置的数量。
  4. 算法特点

    • 利用 k 较小的条件,采用朴素的动态规划即可高效求解。
    • 每个起点独立计算,逻辑清晰,易于实现。
    • 正确处理无向边和自环(如果存在)的情况。
  5. 复杂度

    • 时间复杂度:O(n * k * m),最大为 500 × 20 × 500 = 5 × 10^6,运行速度快。
    • 空间复杂度:O(k * n + m),主要用于存储 dp 数组和边列表。

各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}

1、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

2、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转

3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转


GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html

4、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询