C语言实现Havel-Hakimi算法while循环内排序失效问题求助
代码问题分析
- 计数器未重置:你定义的计数器
a、b仅在程序初始化时赋值为0,每次while循环结束后没有重置,统计全0、负数的结果会累计上一次循环的数值,导致条件判断完全失效,这是最核心的错误,你误以为的排序问题实际不存在,代码每次循环开头都执行了降序排序逻辑。 - 缺少首元素合法性校验:按照Havel-Hakimi定理规则,非升序排序后的第一个元素
temp2如果大于等于当前顶点数vertex_number,说明该度序列不可能构成简单图,你没有加这个判断,很容易出现数组越界访问的问题。 - 移除首元素逻辑不严谨:原来的代码只替换了前
temp2个元素的数值,没有统一完成全部元素的前移,特殊场景下会遗留脏数据影响后续判定。
修正后的代码
#include <stdio.h> int main(){ int j,i,vertex_number,temp1,temp2,a,b; printf("Vertex Number:"); scanf("%d",&vertex_number); int graph[vertex_number]; for(i=0;i<vertex_number;i++){ scanf("%d",&graph[i]); } while(1){ // 每次循环先重置计数器 a = 0; b = 0; // 降序排序数组 for(i=0;i<vertex_number;i++){ for(j=i+1;j<vertex_number;j++){ if(graph[i]<graph[j]){ temp1=graph[i]; graph[i]=graph[j]; graph[j]=temp1; } } } // 判断是否所有顶点度都为0 for(i=0;i<vertex_number;i++){ if(graph[i]==0){ a++; } } if(a==vertex_number){ printf("graph exist."); return 0; } // 判断是否存在负的度 for(i=0;i<vertex_number;i++){ if(graph[i]<0){ b++; } } if(b>0){ printf("graph not exist."); return 0; } temp2=graph[0]; // 新增首元素合法性判断 if(temp2 >= vertex_number){ printf("graph not exist."); return 0; } // 统一移除首元素,所有元素前移一位 for(i=0;i<vertex_number-1;i++){ graph[i]=graph[i+1]; } vertex_number--; // 前temp2个元素各减1 for(i=0;i<temp2;i++){ graph[i]-=1; } // 调试打印 printf("-------------\n"); for(i=0;i<vertex_number;i++){ printf("%d\n",graph[i]); } } }
内容的提问来源于stack exchange,提问作者Caner
相关产品推荐
相关产品推荐

