【发布时间】:2015-10-05 22:01:37
【问题描述】:
虽然关于这个主题有几个问题,但我需要一些更具体的建议。
我正在做一些我必须重命名实体的项目。这意味着保存一个包含实体旧名称和新名称的新对象。这就是软件的工作原理。
现在,我要做的是检查当有人尝试重命名对象时是否尝试循环依赖。例如:
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 的第一个循环。我错过了什么?
【问题讨论】:
标签: java graph dependencies