当前位置: 首页 > news >正文

数据结构 C 代码 7.4: 关键路径

摘要: 关键路径算法有一定的难度, 先从左到右, 再从右到左.

1. 代码

将 Java 代码https://blog.csdn.net/minfanphd/article/details/116975772 稍作整理, 告诉 DeepSeek: 将如下 Java 代码翻译为 C 代码.

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdbool.h>#defineMAX_DISTANCE10000typedefstructIntMatrix{int**data;introws;intcols;}IntMatrix;IntMatrix*IntMatrix_create(introws,intcols);IntMatrix*IntMatrix_copy(constIntMatrix*src);IntMatrix*IntMatrix_identity(introws);voidIntMatrix_free(IntMatrix*matrix);voidIntMatrix_print(IntMatrix*matrix);intIntMatrix_add(IntMatrix*self,constIntMatrix*other);IntMatrix*IntMatrix_multiply(constIntMatrix*a,constIntMatrix*b);typedefstructNet{intnumNodes;IntMatrix*weightMatrix;}Net;Net*Net_create(intnumNodes);Net*Net_create_from_matrix(int**matrix,introws,intcols);voidNet_free(Net*net);bool*criticalPath(Net*net);// IntMatrix 函数实现IntMatrix*IntMatrix_create(introws,intcols){IntMatrix*matrix=(IntMatrix*)malloc(sizeof(IntMatrix));matrix->rows=rows;matrix->cols=cols;matrix->data=(int**)malloc(rows*sizeof(int*));for(inti=0;i<rows;i++){matrix->data[i]=(int*)malloc(cols*sizeof(int));memset(matrix->data[i],0,cols*sizeof(int));}returnmatrix;}IntMatrix*IntMatrix_copy(constIntMatrix*src){IntMatrix*dest=IntMatrix_create(src->rows,src->cols);for(inti=0;i<src->rows;i++){memcpy(dest->data[i],src->data[i],src->cols*sizeof(int));}returndest;}IntMatrix*IntMatrix_identity(introws){IntMatrix*matrix=IntMatrix_create(rows,rows);for(inti=0;i<rows;i++){matrix->data[i][i]=1;}returnmatrix;}voidIntMatrix_free(IntMatrix*matrix){for(inti=0;i<matrix->rows;i++){free(matrix->data[i]);}free(matrix->data);free(matrix);}voidIntMatrix_print(IntMatrix*matrix){printf("[");for(inti=0;i<matrix->rows;i++){if(i>0)printf(" ");printf("[");for(intj=0;j<matrix->cols;j++){printf("%d",matrix->data[i][j]);if(j<matrix->cols-1)printf(", ");}printf("]");if(i<matrix->rows-1)printf(",\n");}printf("]\n");}intIntMatrix_add(IntMatrix*self,constIntMatrix*other){if(self->rows!=other->rows||self->cols!=other->cols){fprintf(stderr,"Matrix dimensions mismatch\n");return-1;}for(inti=0;i<self->rows;i++){for(intj=0;j<self->cols;j++){self->data[i][j]+=other->data[i][j];}}return0;}IntMatrix*IntMatrix_multiply(constIntMatrix*a,constIntMatrix*b){if(a->cols!=b->rows){fprintf(stderr,"Matrix multiplication dimensions mismatch\n");returnNULL;}IntMatrix*result=IntMatrix_create(a->rows,b->cols);for(inti=0;i<a->rows;i++){for(intj=0;j<b->cols;j++){for(intk=0;k<a->cols;k++){result->data[i][j]+=a->data[i][k]*b->data[k][j];}}}returnresult;}// Net 函数实现Net*Net_create(intnumNodes){Net*net=(Net*)malloc(sizeof(Net));net->numNodes=numNodes;net->weightMatrix=IntMatrix_create(numNodes,numNodes);for(inti=0;i<numNodes;i++){for(intj=0;j<numNodes;j++){net->weightMatrix->data[i][j]=MAX_DISTANCE;}}returnnet;}Net*Net_create_from_matrix(int**matrix,introws,intcols){Net*net=(Net*)malloc(sizeof(Net));net->weightMatrix=IntMatrix_create(rows,cols);net->numNodes=rows;for(inti=0;i<rows;i++){memcpy(net->weightMatrix->data[i],matrix[i],cols*sizeof(int));}returnnet;}voidNet_free(Net*net){IntMatrix_free(net->weightMatrix);free(net);}bool*criticalPath(Net*net){intnumNodes=net->numNodes;int*tempInDegrees=(int*)calloc(numNodes,sizeof(int));int*tempEarliestTime=(int*)calloc(numNodes,sizeof(int));int*tempOutDegrees=(int*)calloc(numNodes,sizeof(int));int*tempLatestTime=(int*)malloc(numNodes*sizeof(int));bool*result=(bool*)calloc(numNodes,sizeof(bool));// 计算入度for(inti=0;i<numNodes;i++){for(intj=0;j<numNodes;j++){if(net->weightMatrix->data[i][j]!=-1){tempInDegrees[j]++;}}}// 拓扑排序计算最早时间int*inDegreesCopy=(int*)malloc(numNodes*sizeof(int));memcpy(inDegreesCopy,tempInDegrees,numNodes*sizeof(int));for(inti=0;i<numNodes;i++){if(inDegreesCopy[i]!=0)continue;for(intj=0;j<numNodes;j++){if(net->weightMatrix->data[i][j]!=-1){intnewTime=tempEarliestTime[i]+net->weightMatrix->data[i][j];if(newTime>tempEarliestTime[j]){tempEarliestTime[j]=newTime;}inDegreesCopy[j]--;}}}printf("Earliest time: ");for(inti=0;i<numNodes;i++){printf("%d, ",tempEarliestTime[i]);}printf("\n");// 计算出度for(inti=0;i<numNodes;i++){for(intj=0;j<numNodes;j++){if(net->weightMatrix->data[i][j]!=-1){tempOutDegrees[i]++;}}}// 初始化最晚时间intcriticalTime=tempEarliestTime[numNodes-1];for(inti=0;i<numNodes;i++){tempLatestTime[i]=criticalTime;}// 反向拓扑排序计算最晚时间int*outDegreesCopy=(int*)malloc(numNodes*sizeof(int));memcpy(outDegreesCopy,tempOutDegrees,numNodes*sizeof(int));for(inti=numNodes-1;i>=0;i--){if(outDegreesCopy[i]!=0)continue;for(intj=0;j<numNodes;j++){if(net->weightMatrix->data[j][i]!=-1){intnewTime=tempLatestTime[i]-net->weightMatrix->data[j][i];if(newTime<tempLatestTime[j]){tempLatestTime[j]=newTime;}outDegreesCopy[j]--;}}}printf("Latest time: ");for(inti=0;i<numNodes;i++){printf("%d, ",tempLatestTime[i]);}printf("\n");// 确定关键路径for(inti=0;i<numNodes;i++){result[i]=(tempEarliestTime[i]==tempLatestTime[i]);}free(tempInDegrees);free(tempEarliestTime);free(tempOutDegrees);free(tempLatestTime);free(inDegreesCopy);free(outDegreesCopy);returnresult;}// 测试代码intmain(){inttempMatrix3[6][6]={{-1,3,2,-1,-1,-1},{-1,-1,-1,2,3,-1},{-1,-1,-1,4,-1,3},{-1,-1,-1,-1,-1,2},{-1,-1,-1,-1,-1,1},{-1,-1,-1,-1,-1,-1}};// 转换为二维指针数组int**matrix=(int**)malloc(6*sizeof(int*));for(inti=0;i<6;i++){matrix[i]=(int*)malloc(6*sizeof(int));memcpy(matrix[i],tempMatrix3[i],6*sizeof(int));}Net*net=Net_create_from_matrix(matrix,6,6);bool*critical=criticalPath(net);printf("Critical nodes: ");for(inti=0;i<6;i++){if(critical[i])printf("%d ",i);}printf("\n");// 释放内存for(inti=0;i<6;i++)free(matrix[i]);free(matrix);Net_free(net);free(critical);return0;}

2. 运行结果

Earliest time:0,3,2,6,6,8,Latest time:0,4,2,6,7,8,Critical nodes:0235

3. 小结

  • 主要看 criticalPath 函数.
  • 逻辑有一点难度, 当然, 也很有趣.
  • 注意: 当前代码有 bug, 我要找时间来重新弄一下.
http://www.jsqmd.com/news/1068348/

相关文章:

  • 构建有记忆的AI助手:深入解析OpenAI-Agents Session系统的架构设计与实战应用
  • EthereumJS-TX迁移指南:从独立库到EthereumJS VM monorepo的无缝过渡
  • 技术视角:ET框架的架构革新与分布式游戏服务端设计范式
  • TaskJuggler资源分配技巧:让团队效率最大化的秘密武器
  • UI-TARS技术深度解析:多模态智能体在GUI自动化领域的创新突破
  • Next-Admin国际化(i18n)最佳实践:多语言企业应用开发指南
  • Spraykatz高级参数详解:-u、-p、-t参数的最佳实践
  • X-SwiftFormat vs 其他格式化工具:为什么它是Swift开发者的最佳选择
  • 天翼云主机采购到域名备案再到项目发布全流程笔记
  • 如何快速上手WebRTC:5分钟实现浏览器视频通话的完整指南
  • Imogen工作流实战:从概念到成品的纹理设计全流程
  • 如何快速上手MCP-Security-Checklist:初学者完整教程与实战演练
  • 快速掌握SmartContracts-audit-checklist:Solidity审计效率提升300%
  • 如何快速集成 Hakawai:10分钟实现强大的 iOS 文本编辑器
  • React SSR Setup错误处理:构建健壮的React SSR应用的错误边界策略
  • Apache Ozone 介绍与部署使用(最新版2.0.0)
  • iOS网络请求优化终极指南:基于aqtoolkit的LowMemoryDownload实现
  • HACG搜索功能完全指南:如何高效查找动漫、漫画资源
  • 深度强化学习在ros+gazebo来实现导航的流程
  • Winterfell与后端集成指南:表单数据处理与提交最佳实践
  • CS2303 (原CS356) - 操作系统课程设计
  • Medium Editor Markdown深度解析:从安装到高级配置的完整教程
  • 3分钟掌握:B站会员购抢票工具实战应用指南
  • Whisper Mic模型选择指南:tiny到large-v3,哪款最适合你的需求?
  • Snap深度解析:理解SwiftUI可吸附抽屉的核心架构与实现原理
  • Czkawka开源贡献完全指南:如何参与这个强大的文件管理工具开发
  • TextureLab入门教程:10分钟创建你的第一个程序化材质
  • MAAC未来发展方向:多智能体强化学习的前沿趋势与挑战
  • 如何解析RoseTTAFold-All-Atom输出结果:从PDB文件到结构质量评估的完整指南
  • 如何快速上手synp:5分钟完成锁文件格式转换