有向无环图DAG

DAG :Directed Acyclic Graph---有向无环图

DAG模式说白了就是多条链跟随主链,这些链之间大方向相同且不存在环路。

DAG其实与数组、排列、区块链一样,也是一种数据结构。

首先来看区块链,区块链是一种链式数据结构,如下图:

而DAG的数据结构则可以用下图来表示:

在上图中,1和2号是创世节点;第3个节点产生时,只需要确认1号和2号的交易;第4个节点产生时,只需要确认2号和3号,以此类推。

上图是已经经过拓扑排序后的图,比较好理解。它也可以表示成网络图结构,如下图:

以下是一个简单的C++ DAG类的构建: ```c++ #include <iostream> #include <vector> using namespace std; class DAG { private: vector<vector<int>> adjList; // 存储图的邻接表 vector<int> inDegree; // 存储每个节点的入度 public: // 构造函数 DAG(int numNodes) { adjList.resize(numNodes); inDegree.resize(numNodes, 0); } // 添加一条有向边 void addEdge(int u, int v) { adjList[u].push_back(v); inDegree[v]++; } // 拓扑排序 vector<int> topologicalSort() { vector<int> result; vector<bool> visited(adjList.size(), false); // 找到所有入度为0的节点 for (int i = 0; i < adjList.size(); i++) { if (inDegree[i] == 0 && !visited[i]) { visited[i] = true; result.push_back(i); // 更新相邻节点的入度 for (int j = 0; j < adjList[i].size(); j++) { int neighbor = adjList[i][j]; inDegree[neighbor]--; } // 重置i,从头开始找入度为0的节点 i = -1; } } return result; } }; int main() { DAG dag(6); dag.addEdge(0, 1); dag.addEdge(1, 2); dag.addEdge(1, 3); dag.addEdge(2, 4); dag.addEdge(3, 4); dag.addEdge(4, 5); vector<int> result = dag.topologicalSort(); for (int i = 0; i < result.size(); i++) { cout << result[i] << " "; } return 0; } ``` 在上面的代码中,我们定义了一个DAG类来表示有向无环图,它包含两个成员变量:邻接表 `adjList` 和每个节点的入度 `inDegree`。我们可以使用 `addEdge` 方法向图中添加一条有向边,并使用 `topologicalSort` 方法执行拓扑排序来得到一个可行的执行顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你认识小汐吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值