通过海量题库、编程比赛和实时排名,系统化提升您的编程能力。
"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]
如果一个模板声明列出了多个参数,则每个参数之间必须用逗
已知函数print没有返回值,如果在类中将其声明为
有如下类和对象的定义,下列各组语句中,能输出3.141
有如下程序段:执行这个程序段输出字符'*'的个数是
下列关于构造函数的说法中,正确的是
C 语言代码如下:int i = 32777;shor
利用函数模板,设计求一个数组元素之和的函数sum和两个
编程实现小型公司的工资管理。该公司主要有4类人员:经理
表达式{1,2,3} - {3,4,5}的值为____
已知x={1:2,2:3,3:4},那么表达式sum
表达式int('123',8)的值为_________
键盘输入数字5,以下代码的输出结果是。
表达式type(3+4j)in(int,float,c
下面程序段是找出整数的所有因子。请填空______.
在C语言中,以下说法不正确的是( )。
编写的Shell程序运行前必须赋予该脚本文件_____
关系数据库的实体完整性规则规定基本关系的 都不能
设关系模式R(A,B,C)和S(B,D,E),R和S执
设给定权值总数有n 个,其哈夫曼树的结点总数为( )
Web 浏览器向侦听标准端口的 Web 服务器发出请求
以下语句错误的是( )
表示"x≥y≥z"的C表达式是_____。
执行语句for(i=1;i++<4;);后变量i的值是
表达式a+=b相当于表达式_____。
一个C程序总是从_____开始执行。
假设输入的所有数的绝对值都不超过1000,当输入为“1
定义一种字符串操作为交换相邻两个字符。将“DACFEB
下列数据流图(DFD)构造规则中正确的是
一棵具有 5 层的满二叉树中结点数为 ( ) 。
有 6 个城市,任何两个城市之间都有一条道路连接, 6
更多选择题
更多填空题
第十章 C++流
第九章 C++模板
第八章 C++运算符重载
C++语言程序设计真题5
C++语言程序设计真题4
C++语言程序设计真题3
C++语言程序设计真题2