这段代码是什么语言?功能是什么?求详解及C++实现版本
代码功能解析与C++版本实现
原代码说明
这段代码是Pascal/Delphi风格的代码,核心功能是计算关系的传递闭包——对应离散数学里,用邻接矩阵表示集合元素间的二元关系后,通过这个算法补全所有间接存在的关系。
核心逻辑拆解
假设M是一个n×n的布尔矩阵(元素为真/假),M[r,c] = true表示集合中第r个元素和第c个元素存在直接关系:
- 外层循环遍历每个中间节点
c - 中层循环遍历每个起始节点
r - 如果
r和c存在直接关系(M[r,c]为真),就进入内层循环:- 遍历所有目标节点
k,执行M[r,k] := M[r,k] or M[c,k] - 这句的意思是:如果原本
r能直接到k,或者r能到c且c能到k(也就是r可以通过c间接到达k),就把M[r,k]标记为真。本质是把c的所有可达节点,合并到r的可达集合中。
- 遍历所有目标节点
反复执行这个过程后,最终的M矩阵就是原关系的传递闭包——所有直接/间接存在的关系都会被标记出来。
对应的C++版本
下面是等价的C++实现,这里提供两种下标风格:
1-based下标(和原代码逻辑完全对齐)
#include <vector> using namespace std; void computeTransitiveClosure(vector<vector<bool>>& M, int n) { for (int c = 1; c <= n; ++c) { for (int r = 1; r <= n; ++r) { if (M[r][c]) { for (int k = 1; k <= n; ++k) { M[r][k] = M[r][k] || M[c][k]; } } } } }
0-based下标(C++更常用的写法)
#include <vector> using namespace std; void computeTransitiveClosure(vector<vector<bool>>& M, int n) { for (int c = 0; c < n; ++c) { for (int r = 0; r < n; ++r) { if (M[r][c]) { for (int k = 0; k < n; ++k) { M[r][k] = M[r][k] || M[c][k]; } } } } }
内容的提问来源于stack exchange,提问作者smrcekp
相关产品推荐
相关产品推荐

