我怎样才能在图中找到双组件?叫做块

时间:2011-12-18 15:49:20

标签: c++ algorithm graph

这是我的尝试和copypastings。但是我必须写什么才能找到biconnectedcomponent(称为块)?

#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连通分量)是最大双连通子图。

2 个答案:

答案 0 :(得分:0)

好的,我想到的是一种非常强力的方法,但不能很好地扩展,但我也记得读过,发现双连通组件实际上是一个难题,在计算上,所以让我们先从它开始然后看看是否有优化要做。

给定一组N个节点,检查每个可能的节点子集是否形成双连通组件。通常,您需要最大的组件,所以只需要从整个图表开始,然后是N-1节点的所有子图,N-2等等。一旦找到一个解决方案,你就会知道你找到了一个最大可能的尺寸,你可以做到。不过,在最坏的情况下,你最终会检查2 ^ N个子图。所以从构建要测试的图形的循环开始。

要确定具有K个节点的给定图是否是双连通分量,请遍历所有K *(K-1)/ 2对节点,并找出它们之间是否存在两条独立路径。

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

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

答案 1 :(得分:0)

使用深度优先搜索,可以使用线性运行时算法查找给定图形中的所有切割点(或切割顶点或关节点)。

一旦找到所有切割点,就很容易找到所有的双组分。