C++ 如何在图中找到双分量?称为块

C++ 如何在图中找到双分量?称为块,c++,algorithm,graph,C++,Algorithm,Graph,这是我的尝试和复制粘贴。但我必须写些什么才能找到叫做block的双连接组件呢 #include <fstream> #include <vector> using namespace std; ifstream cin ("test3.txt"); ofstream cout ("output.txt"); const int l = 6; int G[l][l]; int MAXN; int used[l]; int number[l], low[l], count

这是我的尝试和复制粘贴。但我必须写些什么才能找到叫做block的双连接组件呢

#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("test3.txt");
ofstream cout ("output.txt");

const int l = 6;
int G[l][l];
int MAXN; 
int used[l];
int number[l], low[l], counter = 1, kids = 0;
vector <int> block[l];

void BiComp(int curr, int prev) {
    int kids = 0;
    low[curr] = number[curr] = counter++;
    used[curr] = 1;
    for(int i = 0; i < MAXN; i++) {
        if(G[curr][i] == 1) {
            if (i != prev) {
                if (used[i] == 0) {

                    kids++;
                    block[0].push_back(curr);
                    block[0].push_back(i);
                    BiComp(i, curr);
                    low[curr] = min(low[curr], low[i]);
                    if(low[i] >= number[curr] && (prev != -1 || kids >= 2)) {
                        cout << "tochka " << curr + 1 << endl;

                    }



                } else {

                    block[0].push_back(i);
                    block[0].push_back(prev);
                    cout<<block<<endl;
                    low[curr] = min(low[curr], number[i]);
                }
            }
        }
    }
}

void main() 
{
    MAXN = 6;
    for (int i = 0; i < MAXN; i++)
    {
        for (int j = 0; j < MAXN; j++)
        {
            cin >> G[i][j];
            cout << G[i][j] << " "; 
        }
        cout << endl;
    }
    //for (int i = 0; i < MAXN; i++) {
        //if (number[i] == 0) {
            BiComp(0, -1);
        //}
    //}
}
我怎样才能通过这个代码找到,同时找到切点块???
在图论中,双连通分量或2连通分量是最大双连通子图。

好的,我想到的是一种非常残酷的方法,它不能很好地扩展,但我还记得读到过,从计算上来说,找到双连通分量实际上是一个困难的问题,所以,让我们从它开始,然后看看是否有优化要做

给定一组N个节点,检查每个可能的节点子集是否构成双连接组件。通常,您需要可用的最大组件,因此只需从整个图开始,然后是N-1节点、N-2节点的所有子图,依此类推。一旦你找到了一个解决方案,你就会知道你已经找到了一个最大可能的解决方案,你完全可以。不过,在最坏的情况下,您将检查2^N个子图。因此,从一个循环开始构建要测试的图形

若要确定具有K个节点的给定图是否为双连通组件,请在所有K*K-1/2对节点上循环,并确定它们之间是否有两条独立的路径

为了确定两个节点i和j是否双向连接,首先查找它们之间的所有路径。对于每个路径,找出是否有到该路径的替代连接。如果你找到一个,那一对就完了。如果不是,您已经找到了证据,证明您正在查看的图形不是双连通的,并且您可以从所有循环中中断,但外部循环除外,并测试下一个图形


为了查看i和j之间是否存在替代连接,请取出第一条路径中使用的所有边,然后查看是否可以找到另一条。如果可以,你对我和j都很好。如果找不到,请继续找到初始路径列表中的下一个路径。如果在取出所涉及的边时,到达路径列表的末尾,但未找到存在备选路径的路径,这两个节点不是双连接的,因此整个图形不是双连接的。

有一个线性运行时算法,用于使用深度优先搜索查找给定图形中的所有切点、切点或连接点


一旦你找到了所有的切点,就很容易找到所有的双分量。

那么你所展示的代码有什么问题吗?我不了解查找块的算法,所以我不知道如何编写它[12,2345,56-是块,这就是我所知道的,你会从我上面提出的算法中得到2345。然而,在维基百科条目的英文版本中,你也会得到一个算法的建议。