一种从有向图计算线图的有效算法

时间:2009-06-03 21:40:52

标签: algorithm graph-theory linegraph

有没有人知道从有向图计算线图的有效算法?请参阅http://en.wikipedia.org/wiki/Line_graph(维基百科文章提到底部附近的有向图案例(在“推广”部分中)。理想情况下,我想在线性时间内完成此操作。

从该部分开始:

  • 如果G是有向图,则其有向折线图或折线图对于G的每个边都有一个顶点。
  • 当v = w时,表示从u到v以及从w到x的g的有向边的两个顶点通过ura的边连接到线图中的wx。

设G是有向图 设L(G)为有向线图

我给出的算法可以产生给定G的L(G):

  • 遍历G的所有边缘以生成L(G)
  • 的节点
  • 遍历L(G)中的所有节点对(uv,wx),如果v = w
  • 则连接

这是一个O(n ^ 2)算法。

似乎应该有一种方法可以将其降低到O(n)时间。我要考虑这个,但我想我会问堆栈溢出,以防万一有一些我不知道的着名(或不那么着名)的算法。

2 个答案:

答案 0 :(得分:1)

嗯......我认为在经过一些考虑之后可能会有一个更节省时间的算法...但是这需要相当数量的簿记和一大块额外的内存来实现。

我的基本想法是,您遍历G中的所有节点,并从连接到每个节点的边创建连接的节点。通过额外的链接来跟踪G(边缘)到L(G)(节点),您可以通过G上的节点只通过一个循环逃脱。

答案 1 :(得分:1)

你不能从O(n ^ 2)开始,因为有一些带有线性图的图形,其边缘的基数等于原始顶点的基数的平方:想想,对于例如,在具有n + 1个顶点的图形中,单个顶点连接到其他所有顶点:然后您需要构建一个包含n个顶点的clique,因此使用(n-1)^ 2个边。

算法的复杂性从底部受到它产生的输出大小的限制。

当然,这并不意味着我们不必找到智能算法。我想到了这一点:

LG(LN,LE) getLinearGraph(G(N,E)) {
  LN = EmptySet();
  LE = EmptySet();
  for (Vertex v : N) {
    verticesToAdd = EmptySet()
    for (Vertex i : out-degree(v) {
      toAdd += textual-rep((v,i));
    }
    LN += toAdd;
    LE += make-clique(toAdd);
  }
}