我有一个包含大约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:
Ω(n²)
,我认为你不能比n³
更好。 - Niklas B.Ω(n²)
条边!此外,在聊天中,OP暗示这些边是有向的,但他/她提供的代码只检查每条边的一个方向(有向三角形可以“定向”两种不同的方式)。 - j_random_hacker