![](/img/trans.png)
[英]Find a cycle in an undirected graph (boost) and return its vertices and edges
[英]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的循環 - 或者檢查沒有這樣的循環。
該想法是具有負和的圓柱體的至少一個邊緣必須具有負權重。 並且我們可以在循環中以最低權重開始循環。
如果你知道負權重的數字邊是O(n),那么這個算法將是O(n 2 ld n),因為算法將由步驟1支配(=根據權重對邊緣進行排序)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.