文章
126
粉丝
0
获赞
3
访问
21.6k
评分及理由
(1)得分及理由(满分4分)
学生答案的设计思想描述为:先统计初始状态中入度为0的节点数,若节点数大于1或等于0,直接返回0。若节点数为1,则将该节点指向的边移除,继续循环,直到所有节点都被统计,则返回1。该思想与标准答案一致,正确描述了拓扑排序过程中检查唯一性的核心逻辑(即每一步只能有一个入度为0的节点)。因此得4分。
(2)得分及理由(满分9分)
学生代码实现基本遵循了设计思想,但存在以下逻辑错误:
1. 内层循环使用了重复的循环变量名`i`(外层循环的`i`和内层循环的`i`冲突),这会导致外层循环变量被覆盖,逻辑错误。扣2分。
2. 在检查节点入度时,使用`G.Edge[i][j] > 0`判断是否存在边,但标准答案中邻接矩阵存储的是整型(可能为0或1),该判断正确,不扣分。
3. 删除边时,代码修改了原始图结构(`G.Edge[j][i] = 0`),但题目要求基于邻接矩阵存储的图,且算法不应修改原图(标准答案使用入度数组模拟移除)。修改原图会导致后续计算错误,且不符合拓扑排序的常规实现(应使用入度数组模拟)。扣3分。
4. 代码使用`visited`数组标记已处理的节点(入度为0的节点),但标准答案通过将入度置为-1模拟移除,逻辑类似,不扣分。
5. 代码没有显式计算入度数组,而是每次通过遍历邻接矩阵列来实时计算入度(通过内层循环检查`G.Edge[i][j] > 0`),该方法正确但效率较低,但题目未要求效率,因此不扣分。
6. 代码最后缺少分号(`return 1`后无分号),但可能是识别错误,视为误写不扣分。
综上,逻辑错误扣5分(变量冲突扣2分+修改原图扣3分),代码实现部分得4分。
题目总分:4+4=8分
登录后发布评论
暂无评论,来抢沙发