簡體   English   中英

如何在圖形中找到3條邊的負加權循環?

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

我有一個有大約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 - 否則你就完成了(第二次修剪)

該想法是具有負和的圓柱體的至少一個邊緣必須具有負權重。 並且我們可以在循環中以最低權重開始循環。

如果你知道負權重的數字邊是O(n),那么這個算法將是O(n 2 ld n),因為算法將由步驟1支配(=根據權重對邊緣進行排序)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM