虽然有一些关于这个主题的问题,但我需要更具体的建议。
我正在处理一个项目,在其中我必须重命名一个实体。这意味着保存一个包含实体旧名称和新名称的新对象。软件是这样工作的。
现在,我需要做的是检查是否存在循环依赖关系,当有人尝试重命名一个对象时。例如:
A -> B
B -> C
C -> A
当有人试图将C重命名为A时,应发出信号。
我不确定如何解决这个问题。我的想法是创建一个有向图,包含边[A,B],[B,C],[C,A],然后应用一些循环依赖检测算法(如Tarjan算法)来查找循环依赖关系。
考虑到该图不会连接,这样做是否有效?可能会出现上述示例,然后:
E -> F
H -> J
X -> Y
我最终会得到很多未连接的边和一些循环,也许应该先找到较小的已连接图形,然后对每个图形应用任何算法,还是有可能直接构建大型图形并在其上应用算法?
对于我的示例,最快且推荐的检测循环依赖关系的方法是什么?
谢谢!
更新 我想出了以下dfs方法:
void DFS(int root, boolean[] visited){
onStack = new boolean[N];
edgeTo = new int[N];
visited[root]=true;
onStack[root] = true;
for (int i=0; i<N; ++i){
if (G[root][i]){
if(!visited[i]){
DFS(i,visited);
} else if (onStack[i]){
System.out.printf("%nCycle %n");
}
} else {
System.out.printf("%nG[" + root + "][" + i + "] is not an edge%n");
}
onStack[root] = false;
}
}
并像这样调用它:
void DFS()
{
boolean[] visited =new boolean[N];
int numComponets=0;
// do the DFS from each node not already visited
for (int i=0; i<N; ++i)
if (!visited[i] && cycle == null)
{
++numComponets;
DFS(i,visited);
}
}
它成功地找到了连接的组件,但没有识别出任何循环,只有在我删除G[root][i]条件时,才会从0到0成为第一个循环。我错过了什么?