文章
119
粉丝
0
获赞
1
访问
7.2k
评分及理由
(1)得分及理由(满分4分)
学生答案的基本设计思想与标准答案一致:通过计算每个顶点的入度,然后在循环中每次查找入度为0的顶点,如果存在多个则返回0(表示拓扑序列不唯一),如果找不到则返回0(表示不存在拓扑序列),如果每次恰好找到一个则继续处理并更新相邻顶点的入度,最终完成所有顶点处理则返回1(表示存在唯一拓扑序列)。因此,思路正确,得4分。
(2)得分及理由(满分9分)
学生代码实现基本正确,但存在以下问题:
1. 在初始化degree数组时,使用了malloc动态分配,但未初始化为0,这可能导致degree数组初始值不确定(因为malloc不会自动清零),从而影响入度计算的正确性。标准答案中直接使用局部数组并初始化为0,更安全。这是一个逻辑错误,扣2分。
2. 在循环中,使用n--控制循环次数(n初始为顶点数),但内部循环遍历所有顶点(包括已处理的顶点),这可能导致重复检查已处理顶点(虽然通过将入度设为负值或其他方式标记已处理是常见做法,但这里学生代码未标记已处理顶点,而是依赖入度减少后为负?)。实际上,学生代码中未将已处理的顶点的入度设置为-1(如标准答案所示),这可能导致后续循环中再次检查到该顶点(因为入度已减为负值,但条件判断只检查0)。但在此代码中,由于处理顶点后,会减少其邻接点的入度,但自身入度未被标记(仍为0?实际上,在第一次找到入度为0的顶点后,会减少其邻接点的入度,但该顶点入度仍为0,下次循环还会被检查到)。这是一个严重逻辑错误:因为每次处理顶点后,未将其入度标记为已处理(例如设置为-1),导致下次循环可能再次选中同一顶点(如果其入度仍为0),但实际中由于该顶点已被处理,不应再参与选择。这会导致错误(例如重复处理同一顶点,或错误判断入度为0的顶点数量)。此错误扣4分。
3. 其他部分(如入度计算、更新邻接点入度等)正确。
综上,代码实现有逻辑错误,扣6分(初始化问题扣2分,未标记已处理顶点扣4分),得3分。
题目总分:4+3=7分
登录后发布评论
暂无评论,来抢沙发