【发布时间】:2016-02-15 05:01:30
【问题描述】:
我需要编写一个算法来找到给定无向图的最小命中集 F,即在图的每个循环中包含最小边的集合,使得 F 和任何给定循环的交集不为空。我编写了一个算法,它使用深度优先搜索来查找图中所有可能的循环,然后在每个循环中获取最小边并将其放入一个集合中(我在其中删除重复项)。
但是,我被要求在多项式时间内完成这项任务,我不太确定我的算法能做到这一点。例如,我添加了一个计数器来解决从 A 开始的以下图表,并且我的 DFS 方法被调用了 34 次:
谁能帮我算出我写的算法的运行时间?它很实用,但似乎效率很低。谢谢
这是我的 DFS 方法的代码。 MHS 是类似节点的基本数据结构。它们有一个标签和一个链接列表,其中包含一个端点(另一个节点)和一个与之关联的整数值)。循环只是一个包含所有循环的 ArrayList,它们本身表示为边缘值的 ArrayList。
我使用了这篇文章https://stackoverflow.com/a/549312/1354784中描述的方法。
public static void DFS(MHS v){
++counter;
if(v.visited){
MHS current=v.predecessor;
ArrayList<Integer> currEdges=new ArrayList<Integer>();
currEdges.add(getEdgeValue(current, v));
while(!current.equals(v)){
MHS p=current.predecessor;
if(p==null)
break;
currEdges.add(getEdgeValue(p, current));
current=p;
}
if(currEdges.size()>0)
cycles.add(currEdges);
}else{
v.visited=true;
for(int i=0;i<v.links.size();i++){
MHS w=v.links.get(i).next;
if(v.predecessor==null || !v.predecessor.equals(w)){
if(v.visited){
MHS ok=w.predecessor;
w.predecessor=v;
DFS(w);
w.predecessor=ok;
}else{
w.predecessor=v;
DFS(w);
}
}
}
v.visited=false;
}
}
【问题讨论】:
标签: java algorithm recursion graph depth-first-search