通过海量题库、编程比赛和实时排名,系统化提升您的编程能力。
"CSP考试" 试卷中 CSP-S1提高级初赛试卷[2023] 中有题目如下:
第1题
(第k小路径)给定一张.个点.条边的有向无环图,顶点编号从0到n-1。对于一条路径,我们定义"路径序列"为该路径从起点出发依次经过的顶点编号构成的序列。求所有至少包含一个点的简单路径中,“路径序列"字典序第k小的路径。保证存在至少k条路径。上述参数满足1≤n.m≤105和1≤k≤1018。
在程序中,我们求出从每个点出发的路径数量。超过1018的数都用1018表示。然后我们根据k的值和每个顶点的路径数量,确定路径的起点,然后可以类似地依次求出路径中的每个点。
试补全程序。
#include <iostream> #include <algorithm> #include <vector> const int MAXN = 100000; constlonglongLIM=100000000000000000011; int n,m,deg[MAXN]; std::vector<int> E[MAXN]; long long k,f[MAXN]; int next(std::vector<int>cand,long long &k){ std::sort(cand.begin(),cand.end()); for(int u : cand){ if (①)return u; k -= f[u]; } return -1; } int main(){ std::cin>>n>>m>>k; for(inti=0;i<m;++i){ int u, v; std::cin >>u >> v;//一条从u到v的边 E[u].push_back(v); ++deg[v]; } std::vector<int> Q; for(inti=0;i<n;++i) if (!deg[i])Q.push_back(i); for(inti=0;i<n;++i){ int u = Q[i]; for (int v : E[u]){ if (②)Q.push_back(v); --deg[v]; } } std::reverse(Q.begin(), Q.end()); for(int u : Q){ f[u]= 1; for(int v:E[u])f[u]=③; } int u = next(Q,k); std::cout << u << std::endl; while(④){ ⑤; u = next(E[u],k); std::cout << u << std::endl; } return 0; }
④处应填( )
u!=-1
!E[u].empty()
k >o
k >1
所属试卷:CSP-S1提高级初赛试卷[2023]
下列关于函数模板的描述中,错误的是
派生类的构造函数的成员初始化列中,不能包含。
在软件生命周期中,能准确地确定软件系统必须做什么和必须
有以下程序:程序运行后的输出结果是。
以下叙述中正确的是( )。
C语言整数不包括。
在Python中定义类时,与运算符“//”对应的特殊方
编写程序,功能是用while循环语句求1到50之间(包
己知x是一个列表对象,那么执行语句了y=x[:]之后表
关键字__________用于测试一个对象是否是一个可
由N个有序整数组成的数列已放在一堆数组中,给定程序MO
软件生命周期可分为定义阶段、开发阶段和维护阶段,下面属
请选择关于/etc/fstab 的正确描述。
设计一个shell程序,添加一个新组为class1,然
安装Linux系统对硬盘分区时,必须有两种分区类 __
关系代数中的σ运算符对应于SQL语言中的 子句。
创建表语句中表示定义自增约束的子句是
关系中外码的值必须取空值,或等于被参照关系中某个元组的
E-R方法的三要素是:实体、属性和 。
下列哪一种图的邻接矩阵是对称矩阵?
下列是MYSQL比较运算符的是( )
下列由当前线程引起的事件或执行的操作中,可能导致该线程
(RMQ 区间最值问题)给定序列a0,⋯,an-1,和
下面属于系统软件的是
对于一个 1到 n的排列 P(即 1到 n中每一个数在
输入:100110101100110110101111
以下和计算机领域密切相关的奖项是( )。
输入: CBBADADA输出: ______
输入: 123 321输出: _________
更多选择题
更多填空题
第十章 C++流
第九章 C++模板
第八章 C++运算符重载
C++语言程序设计真题5
C++语言程序设计真题4
C++语言程序设计真题3
C++语言程序设计真题2