检测有向图中所有周期的最有效算法是什么?
我有一个有向图表示需要执行的作业计划,作业是节点,依赖是边缘.我需要检测此图中循环的错误情况,从而导致循环依赖.
我正在尝试确定完成下述任务的最佳时间效率算法.
我有一套记录.对于这组记录,我有连接数据,表明该组中的记录对如何相互连接.这基本上代表一个无向图,其中记录是顶点,连接数据是边.
集合中的所有记录都有连接信息(即不存在孤立记录;集合中的每个记录都连接到集合中的一个或多个其他记录).
我想从集合中选择任意两条记录,并能够显示所选记录之间的所有简单路径."简单路径"是指路径中没有重复记录的路径(即仅限于有限路径).
注意:两个选择的记录将始终不同(即开始和结束顶点永远不会相同;没有循环).
例如:
If I have the following records:
A, B, C, D, E
and the following represents the connections:
(A,B),(A,C),(B,A),(B,D),(B,E),(B,F),(C,A),(C,E),
(C,F),(D,B),(E,C),(E,F),(F,B),(F,C),(F,E)
[where (A,B) means record A connects to record B]
如果我选择B作为我的起始记录而E作为我的结束记录,我希望找到通过记录连接将记录B连接到记录E的所有简单路径.
All paths connecting B to E:
B->E
B->F->E
B->F->C->E
B->A->C->E
B->A->C->F->E
这是一个例子,实际上我可能有包含数十万条记录的集合.
我需要一个工作算法来查找无向图中的所有简单循环.我知道成本可能是指数级的并且问题是NP完全的,但我将在一个小图(最多20-30个顶点)中使用它,并且循环数量很少.
经过长时间的研究(主要是在这里),我仍然没有工作方法.以下是我的搜索摘要:
无向图中的循环 - >仅检测是否存在循环
在无向图中查找多边形 - >非常好的描述,但没有解决方案
在有向图中查找所有循环 - >仅在有向图中查找循环
我发现的唯一一个解决我问题的答案是:
似乎找到一组基本的循环并对它们进行异或可以解决问题.找到一组基本循环很容易,但我不明白如何组合它们以获得图中的所有循环...
所以,
问题
我有一个关于确定两个点是否连接在2D平面上的算法的问题.我有:
[x,y]- 即每条线看起来像['start'=>[X0, Y0], 'end'=>[X1, Y1]]这条线被命名为L.线可以彼此属于一个(即一个可以是另一个的一部分),它们可以仅与一个点相交等 - 即在2D平面上没有它们的限制.但是线不能是一个点 - 即线的起点不能等于线的终点.S和E,即阵列[Xs, Ys]和[Xe, Ye]现在,所有线L都在平面上绘制.然后,S和E也拉,我需要回答的问题- 可以从S为达到ê不以L任何线的交叉?而且,更具体一点 - 哪种算法最优?通过"可达到"我的意思是,有在飞机上的方式从S以E没有任何交集的线L-和,事业,这种方法可以是任何东西,而不仅仅是行.
样品

-as你看,在样品S和E未连接.同样在样本中存在一条线完全属于另一条线(灰线和紫线)的情况 - 以及一条线在另一条线(绿线和玫瑰线)上具有开始/结束的情况.
我的方法
目前,我有非确定性多项式(NP)算法来做到这一点.它的步骤是:
因此,第一种情况将导致4条新线,3条新线中的2-4例和2条新线中的5例.(线是[A, B]和[C, D])
S包含这些多边形的子集S.要做到这一点,我正在使用简单的算法 - 计算多边形边缘的交点数和从 …我需要使用DFS在有向图中找到最长的周期.
我曾经看过这篇维基百科的文章描述了这样做的方式,我认为它解决了这个问题,例如用以下三种状态之一标记节点:节点尚未访问,完成搜索节点,节点访问,但尚未完成访问.
如果有人能与我分享链接,我将不胜感激.顺便说一句,它不是Tarjan的算法.
下面的问题是我想要解决的问题,如果你想知道的话.
在第一行中给出的两个数字是N和M,每个数字表示节点的数量和有向边的数量.
从第二行给出M组两个数字A和B,这意味着节点A和B连接但您只能遍历从A到B的节点.
input.txt中:
7 9
1 2
2 3
3 1
3 4
4 5
5 1
5 6
6 7
7 2
Run Code Online (Sandbox Code Playgroud)
在这种情况下,答案是6,因为2> 3> 4> 5> 6> 7> 2.
我正在尝试编写一个可以找到最小生成树的程序.但我对这个算法的一个问题是测试电路.在java中执行此操作的最佳方法是什么.
好的,这是我的代码
import java.io.*;
import java.util.*;
public class JungleRoads
{
public static int FindMinimumCost(ArrayList graph,int size)
{
int total = 0;
int [] marked = new int[size]; //keeps track over integer in the mst
//convert an arraylist to an array
List<String> wrapper = graph;
String[] arrayGraph = wrapper.toArray(new String[wrapper.size()]);
String[] temp = new String[size];
HashMap visited = new HashMap();
for(int i = 0; i < size; i++)
{
// System.out.println(arrayGraph[i]);
temp = arrayGraph[i].split(" ");
//loop over connections of a current …Run Code Online (Sandbox Code Playgroud) 我知道这个问题有很多答案.但是,我发现它们中没有一个能够真正实现它.
有人认为一个循环(几乎)与强连通组件相同(s.在有向图中查找所有循环),因此可以使用为该目标设计的算法.
有人认为找到一个循环可以通过DFS完成并检查后端(s.文件依赖关系的boost图文档).
我现在想对是否可以通过DFS检测图中的所有循环并检查后沿有一些建议?
http://www.me.utexas.edu/~bard/IP/Handouts/cycles.pdf(在SO上找到)陈述了一种基于循环基础的方法.我个人而言,我觉得它不是很直观,所以我正在寻找一个不同的解决方案.
编辑:我最初的意见显然是错误的.S."Moron"的下一个回答.
初步意见:我的观点是它确实可以这样工作,因为DFS-VISIT(DFS的伪代码)刚刚进入尚未访问过的每个节点.从这个意义上讲,每个顶点都表现出一个潜在的循环开始.此外,由于DFS每次访问每个边缘,因此也会覆盖通向循环起点的每条边.因此,通过使用DFS和后沿检查,确实可以检测图中的所有周期.注意,如果存在具有不同数量的参与者节点的循环(例如,三角形,矩形等),则必须进行额外的工作以区分每个循环的实际"形状".
如果我有一个无向图,我怎样才能获得所有周期的列表?
例如,从下图中,我想要循环:
(a,b,d,e,c)
(a,b,c)
(b,d,e)
Run Code Online (Sandbox Code Playgroud)

我在编写一个算法时遇到了一些麻烦,该算法返回在无向图上形成简单循环的所有路径.
我首先考虑从顶点A开始的所有循环,对于下图
A,B,E,G,F
A,B,E,D,F
A,B,C,D,F
A,B,C,D,E,G,F
额外的周期将是
B,C,D,E
F,D,E,G
但是这些可以通过例如再次调用相同的算法但分别从B和D开始来找到.
该图如下所示 -

我目前的方法是通过访问A的所有邻居,然后访问邻居的邻居等来构建A的所有可能路径,同时遵循以下规则:
每次存在多个邻居时,就会找到一个分叉,并创建并探索来自A的新路径.
如果任何创建的路径访问原始顶点,则该路径是循环.
如果任何创建的路径访问相同的顶点两次(不同于A),则丢弃该路径.
继续,直到探索了所有可能的路径.
我目前在尝试避免不止一次发现相同的循环时遇到问题,我试图通过查看新邻居是否已经是另一个现有路径的一部分来解决这个问题,以便两个路径组合(如果是独立的)构建一个周期.
我的问题是:我是否遵循正确/更好/更简单的逻辑来解决这个问题.
我很感激你的意见