如何在图中找到3个边缘的负加权周期

How can I find a negative weighted cycle of 3 edges in a graph?

本文关键字:边缘 加权 周期 3个      更新时间:2023-10-16

我有一个有向图的图形,约有10,000个节点。所有边缘均加权。我想找到一个仅包含3个边缘的负周期。是否有比O(n^3)更快的算法?

示例代码:( G是我的图)

if (DETAILS) std::printf  ("Calculating cycle of length 3.n");
for (int i=0;i<NObjects;i++)
{
    for (int j=i+1;j<NObjects;j++)
    {
        for (int k=j+1;k<NObjects;k++)
        {
            if ((d= g[i][j]+g[j][k]+g[k][i])<0)
            {
                results[count][0] = i;
                results[count][1] = j;
                results[count][2] = k;
                results[count][3] = d;
                count++;
                if (count>=MAX_OUTPUT_SIZE3)
                    goto finish3;
            }
            if ((d= g[i][k]+g[k][j]+g[j][i])<0)
            {
                results[count][0] = j;
                results[count][1] = i;
                results[count][2] = k;
                results[count][3] = d;
                count++;
                if (count>=MAX_OUTPUT_SIZE3)
                    goto finish3;
            }
        }
    }
}
finish3:

我无法想到任何比O(N 3 )的明确组合性的算法,但是在实践中,恒定因素也很重要。以下算法允许修剪以速度查找具有负重总和的长度3的循环 - 或检查没有这样的周期。

  1. 根据其重量对(定向)边缘进行排序
  2. 作为起始边缘的重量最低的边缘。
  3. 尝试连接到起始边缘的末端顶点的所有边缘,重量不低于起始边缘(第一修剪),并在关闭周期时检查权重总和。如果您找到一个负和负数的周期,则完成了。
  4. 继续以最低重量作为起始边缘的边缘。如果其重量为负3-否则您完成(第二修剪)

的想法是,至少一个具有负和总和的cylce的边缘必须具有负重量。并且我们可以在周期中以最低的重量开始一个周期。

如果您知道负重的数字边缘为o(n),则该算法将为O(n 2 ld n),因为算法将由步骤1(=分类)主导边缘根据其重量)。