Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在图中找到3条边的负加权循环?_C++_Algorithm_Matlab_Graph_Cycle - Fatal编程技术网

C++ 如何在图中找到3条边的负加权循环?

C++ 如何在图中找到3条边的负加权循环?,c++,algorithm,matlab,graph,cycle,C++,Algorithm,Matlab,Graph,Cycle,我有一个有向图,大约有10000个节点。所有边都已加权。我想找到一个只包含3条边的负循环。有比O(n^3)更快的算法吗 示例代码:(g是我的图) if(DETAILS)std::printf(“长度3的计算循环”。\n”); 对于(int i=0;i,我想不出任何算法的确定共度低于O(n3),但常数因子在实践中也很重要。下面的算法允许修剪以加快查找长度为3且权重和为负数的循环-或检查是否不存在此类循环 根据边的权重对(定向)边进行排序 以重量最小的边作为起始边 尝试连接到起始边末端顶点且权重不低

我有一个有向图,大约有10000个节点。所有边都已加权。我想找到一个只包含3条边的负循环。有比O(n^3)更快的算法吗

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

if(DETAILS)std::printf(“长度3的计算循环”。\n”);

对于(int i=0;i,我想不出任何算法的确定共度低于O(n3),但常数因子在实践中也很重要。下面的算法允许修剪以加快查找长度为3且权重和为负数的循环-或检查是否不存在此类循环

  • 根据边的权重对(定向)边进行排序
  • 以重量最小的边作为起始边
  • 尝试连接到起始边末端顶点且权重不低于起始边(第一次修剪)的所有边,并在关闭循环时检查权重之和。如果发现具有负和的循环,则完成操作
  • 继续使用下一个最低权重的边作为起始边。如果其权重为负,则转到3-否则完成(第二次修剪)
  • 其思想是,一个和为负的圆的至少一条边必须有一个负的权重。我们可以从循环中权重最低的边开始一个循环


    如果您知道具有负权重的边数为O(n),那么该算法将为O(n2 ld n),因为该算法将由步骤1(=根据边的权重对边进行排序)控制。

    什么语言?如果有的话,您使用什么库?此外,您会问是否有比O(n^3)更快的算法算法,这意味着您已经有了一个:是否要添加到该算法的链接?@remo:如果边的数量是
    Ω(n²)
    ,我认为您做得比
    @remo:边的数量限制是什么?我已经阅读了聊天讨论,但仍然不清楚是否确实有
    Ω(n²)
    edges or not!此外,在聊天中,OP表示边是定向的,但他/她提供的代码只检查每条边的一个方向(定向三角形可以“定向”两种不同的方式)。非常感谢。这对我来说是一个很好的起点。{我如何再次查看聊天室?}@remo如果您单击问题下方的“显示更多评论”,您将看到相关链接。如果您只是在一般情况下寻找聊天,则页面顶部会有一个小链接。
    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: