实现用于查找有向图的强连通分量的 Tarjan 算法。 在强连通分量 (SCC) 中,每个节点到每个其他节点都有一条路径。 SCC 是不相交的。 入度或出度为零或属于无环图的节点自己形成 SCC。 接受邻接矩阵作为输入。 为了获得最佳性能,矩阵应该是稀疏的。 还返回一个索引列表,报告每个节点的 SCC 成员资格。 使用示例: >> E = 稀疏([2 3 4 5 5 6 6 7 8 4 9 5 10 6 9], ... [1 2 2 3 4 3 5 6 4 8 8 9 9 10 6], ... 个(1,15)); >> 图; 间谍(E) >> c = tarjan(E) c = [1x4 双] [1x2 双] [7] [3] [2] [1] >> c{1} 答案 = 5 6 9 10 >> >> 在示例中,E 是有向图的邻接矩阵(在屏幕截图中显示),索引为 5、6、9 和
2021-10-21 14:54:08 2KB matlab
1
/* * (有向)图的深度优先遍历算法模板 */ package dsa; public abstract class DFS extends GraphTraverse { //变量 protected static int clock = 0;//遍历过程中使用的计时钟 //构造方法 public DFS(Graph g) { super(g); } //深度优先遍历算法 protected Object traverse(Vertex v, Object info) {//从顶点v出发,做深度优先查找 if (UNDISCOVERED != v.getStatus()) return null;//跳过已访问过的顶点(针对非连通图) v.setDStamp(clock++); v.setStatus(DISCOVERED); visit(v, info);//访问当前顶点 for (Iterator it = v.outEdges(); it.hasNext();) {//检查与顶点v Edge e = (Edge)it.getNext();//通过边e = (v, u) Vertex u = (Vertex)e.getVPosInV(1).getElem();//相联的每一顶点u switch (u.getStatus()) {//根据u当前的不同状态,分别做相应处理 case UNDISCOVERED ://若u尚未被发现,则 e.setType(TREE);//e被归类为“树边” traverse(u, info);//从u出发,继续做深度优先查找 break; case DISCOVERED ://若u已经被发现,但对其访问尚未结束,则 e.setType(BACKWARD);//将e归类为“后向跨边” break; default ://VISITED,即对u的访问已经结束 if (u.getDStamp() < v.getDStamp())//若相对于v,u被发现得更早,则 e.setType(CROSS);//将e归类为“横跨边” else//否则 e.setType(FORWARD);//将e归类为“前向跨边” break; } }//至此,v的所有邻居都已访问结束,故 v.setFStamp(clock++); v.setStatus(VISITED);//将v标记为VISITED return null;//然后回溯 } }
2021-07-30 00:56:24 3KB java dfs 分量算法 有向图 算法图解
1
用matlab仿真实现去除MPU6050三轴加速度中的重力加速度分量
2019-12-21 20:36:50 2KB Matlab
1