数据结构 C 代码 7.4: 关键路径
摘要: 关键路径算法有一定的难度, 先从左到右, 再从右到左.1. 代码将 Java 代码https://blog.csdn.net/minfanphd/article/details/116975772 稍作整理, 告诉 DeepSeek: 将如下 Java 代码翻译为 C 代码.#includestdio.h#includestdlib.h#includestring.h#includestdbool.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-rowsrows;matrix-colscols;matrix-data(int**)malloc(rows*sizeof(int*));for(inti0;irows;i){matrix-data[i](int*)malloc(cols*sizeof(int));memset(matrix-data[i],0,cols*sizeof(int));}returnmatrix;}IntMatrix*IntMatrix_copy(constIntMatrix*src){IntMatrix*destIntMatrix_create(src-rows,src-cols);for(inti0;isrc-rows;i){memcpy(dest-data[i],src-data[i],src-cols*sizeof(int));}returndest;}IntMatrix*IntMatrix_identity(introws){IntMatrix*matrixIntMatrix_create(rows,rows);for(inti0;irows;i){matrix-data[i][i]1;}returnmatrix;}voidIntMatrix_free(IntMatrix*matrix){for(inti0;imatrix-rows;i){free(matrix-data[i]);}free(matrix-data);free(matrix);}voidIntMatrix_print(IntMatrix*matrix){printf([);for(inti0;imatrix-rows;i){if(i0)printf( );printf([);for(intj0;jmatrix-cols;j){printf(%d,matrix-data[i][j]);if(jmatrix-cols-1)printf(, );}printf(]);if(imatrix-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(inti0;iself-rows;i){for(intj0;jself-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*resultIntMatrix_create(a-rows,b-cols);for(inti0;ia-rows;i){for(intj0;jb-cols;j){for(intk0;ka-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-numNodesnumNodes;net-weightMatrixIntMatrix_create(numNodes,numNodes);for(inti0;inumNodes;i){for(intj0;jnumNodes;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-weightMatrixIntMatrix_create(rows,cols);net-numNodesrows;for(inti0;irows;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){intnumNodesnet-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(inti0;inumNodes;i){for(intj0;jnumNodes;j){if(net-weightMatrix-data[i][j]!-1){tempInDegrees[j];}}}// 拓扑排序计算最早时间int*inDegreesCopy(int*)malloc(numNodes*sizeof(int));memcpy(inDegreesCopy,tempInDegrees,numNodes*sizeof(int));for(inti0;inumNodes;i){if(inDegreesCopy[i]!0)continue;for(intj0;jnumNodes;j){if(net-weightMatrix-data[i][j]!-1){intnewTimetempEarliestTime[i]net-weightMatrix-data[i][j];if(newTimetempEarliestTime[j]){tempEarliestTime[j]newTime;}inDegreesCopy[j]--;}}}printf(Earliest time: );for(inti0;inumNodes;i){printf(%d, ,tempEarliestTime[i]);}printf(\n);// 计算出度for(inti0;inumNodes;i){for(intj0;jnumNodes;j){if(net-weightMatrix-data[i][j]!-1){tempOutDegrees[i];}}}// 初始化最晚时间intcriticalTimetempEarliestTime[numNodes-1];for(inti0;inumNodes;i){tempLatestTime[i]criticalTime;}// 反向拓扑排序计算最晚时间int*outDegreesCopy(int*)malloc(numNodes*sizeof(int));memcpy(outDegreesCopy,tempOutDegrees,numNodes*sizeof(int));for(intinumNodes-1;i0;i--){if(outDegreesCopy[i]!0)continue;for(intj0;jnumNodes;j){if(net-weightMatrix-data[j][i]!-1){intnewTimetempLatestTime[i]-net-weightMatrix-data[j][i];if(newTimetempLatestTime[j]){tempLatestTime[j]newTime;}outDegreesCopy[j]--;}}}printf(Latest time: );for(inti0;inumNodes;i){printf(%d, ,tempLatestTime[i]);}printf(\n);// 确定关键路径for(inti0;inumNodes;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(inti0;i6;i){matrix[i](int*)malloc(6*sizeof(int));memcpy(matrix[i],tempMatrix3[i],6*sizeof(int));}Net*netNet_create_from_matrix(matrix,6,6);bool*criticalcriticalPath(net);printf(Critical nodes: );for(inti0;i6;i){if(critical[i])printf(%d ,i);}printf(\n);// 释放内存for(inti0;i6;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:02353. 小结主要看 criticalPath 函数.逻辑有一点难度, 当然, 也很有趣.注意: 当前代码有 bug, 我要找时间来重新弄一下.

相关新闻

通信架构设计源码范例

通信架构设计源码范例

.c文件内容1、变量1、日志标签2、自定义的收发队列3、解析后的报文缓冲区/发送报文打包区4、交互参数1、对端的参数结构体管理,用来记录对端参数状态的,交互用2、己端的参数结构体管理,用来记录己端参数状态的,交互用3、控制过程参…

2026/6/23 17:15:12阅读更多 →
快速掌握SmartContracts-audit-checklist:Solidity审计效率提升300%

快速掌握SmartContracts-audit-checklist:Solidity审计效率提升300%

快速掌握SmartContracts-audit-checklist:Solidity审计效率提升300% 【免费下载链接】SmartContracts-audit-checklist A checklist of things to look for when auditing Solidity smart contracts. 项目地址: https://gitcode.com/gh_mirrors/smar/SmartContra…

2026/6/23 17:15:12阅读更多 →
天翼云主机采购到域名备案再到项目发布全流程笔记

天翼云主机采购到域名备案再到项目发布全流程笔记

目录 一、云主机采购 二、云主机管理 三、配置安全组 四、域名转入 五、域名备案 六、域名服务 七、SSL免费申请(免费获取SSL,方案一) 八、自行安装 Certbot SSL服务(免费获取SSL,方案二,推荐) 九、Nginx SSL服务 (当采用SSL方案一时) 十、工单反馈 一、云主机采购…

2026/6/23 17:15:12阅读更多 →
Claude Opus 4.8 effort机制深度解析:成本与性能的临界点优化

Claude Opus 4.8 effort机制深度解析:成本与性能的临界点优化

1. 这不是“调参指南”,而是成本与性能的临界点测绘图你有没有过这种体验:花大价钱开通了 Claude Opus 4.8 的高级权限,结果写一封周报用了 3 秒,生成一份技术方案却卡了 27 秒,账单月底一看——一半费用烧在了“等它想…

2026/6/23 18:40:37阅读更多 →
DMXAPI+Qwen3.7-Max智能体实战:从PLC文档化看AI编程落地

DMXAPI+Qwen3.7-Max智能体实战:从PLC文档化看AI编程落地

1. 项目概述:这不是一次普通的大模型试用,而是一场智能体工作流的实战压力测试 “DMXAPI 体验笔记:聊聊 Qwen3.7-Max”——这个标题里藏着三个关键信号: DMXAPI 是当前开发者圈里悄然升温的新型 API 网关层,它不直接…

2026/6/23 18:40:37阅读更多 →
MC68010循环模式:硬件级指令优化与嵌入式性能提升

MC68010循环模式:硬件级指令优化与嵌入式性能提升

1. 项目概述在嵌入式系统和早期计算机的底层开发中,性能优化往往需要深入到指令执行的层面。对于像MC68010这样的经典微处理器,其设计哲学并非单纯追求高主频,而是通过精巧的硬件架构来最大化每一条指令的执行效率。其中,循环模式…

2026/6/23 18:40:37阅读更多 →
数字取证实战:5大技巧高效破解加密电子证据

数字取证实战:5大技巧高效破解加密电子证据

1. 项目概述:当加密成为证据的“锁”在数字取证和电子数据审查领域,我们最常遇到的挑战之一,就是无处不在的加密。想象一下,你拿到了一台涉案的笔记本电脑或一个关键的U盘,但里面的文档、压缩包甚至整个磁盘分区都被密…

2026/6/23 18:40:37阅读更多 →
AI Agent核心原理与工程落地五模块详解

AI Agent核心原理与工程落地五模块详解

1. 从“能聊天”到“会做事”:AI Agent到底在解决什么真问题?很多人第一次听说AI Agent,是在看到某段演示视频里——一个AI自动打开浏览器查资料、调用Excel整理数据、再把结果写进PPT生成汇报稿。那一刻的直觉反应往往是:“这不就…

2026/6/23 18:40:37阅读更多 →
Apache Traffic Server在Ubuntu 14.04上的反向代理实战

Apache Traffic Server在Ubuntu 14.04上的反向代理实战

1. 项目概述:为什么在 Ubuntu 14.04 上用 ATS 做反向代理不是“怀旧”,而是精准选型Apache Traffic Server(ATS)不是 Nginx 的平替,也不是 HAProxy 的简化版——它从诞生起就带着雅虎大规模内容分发的基因,…

2026/6/23 18:35:36阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/23 7:04:52阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/23 1:55:32阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/23 5:55:37阅读更多 →
2026年京东云 618 活动 Hermes Agent/OpenClaw配置Token Plan新手必看指南

2026年京东云 618 活动 Hermes Agent/OpenClaw配置Token Plan新手必看指南

2026年京东云 618 活动 Hermes Agent/OpenClaw配置Token Plan新手必看指南。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流…

2026/6/23 0:00:38阅读更多 →
2026年北京电子沙盘制作公司深度评测:从技术选型到落地效果,谁在真正定义“数字+实体”的融合边界?

2026年北京电子沙盘制作公司深度评测:从技术选型到落地效果,谁在真正定义“数字+实体”的融合边界?

模块一:行业背景——百亿赛道爆发,北京市场的特殊性与选型困局2026年,电子沙盘行业已走过“要不要做”的讨论,进入“找谁做、怎么做”的深水区。据行业研究机构数据,2025年国内电子沙盘市场规模已突破85亿元&#xff0…

2026/6/23 0:00:38阅读更多 →
音视频场景下的 Java 开发者面试:技术与挑战

音视频场景下的 Java 开发者面试:技术与挑战

面试互联网大厂:从音视频场景看 Java 开发者的技能与挑战 在互联网大厂求职的面试中,Java 开发者往往需要面对严苛的技术问题。今天,我们将通过一位名叫燕双非的搞笑程序员与严肃的面试官之间的对话,看看在音视频场景下&#xff0…

2026/6/23 0:00:38阅读更多 →