检查大图中的二分图,由几个断开的图组成?

时间:2013-06-23 20:14:14

标签: data-structures graph-theory bipartite

我在SPOJ SPOJ:BUGLIFE上遇到了问题 它要求我检查图表是否是二分图。我知道单个连接图的方法,但是对于断开连接的图的组合,我的方法给出了超出时间限制的错误。 这是我的方法 - 广度优先搜索,使用循环队列和邻接列表实现的图形。 方法 - >选择一个源,如果该源顶点=未访问,则启动广度优先搜索,假设它是源。如果我在BFS中发现了冲突,那么我就放弃了整个事情。另外,我转移到另一个未访问的来源。 我怎样才能让它更快?或更好?

P.S。我是图论的新手,所以请详细解释。

1 个答案:

答案 0 :(得分:0)

在非常大的数据集(edages> 1000)中进行测试时,以下实现(C ++版本)足够快。希望它有所帮助。

struct NODE
{
    int color;
    vector<int> neigh_list;
};

bool checkAllNodesVisited(NODE *graph, int numNodes, int & index);

bool checkBigraph(NODE * graph, int numNodes)
{
    int start = 0;

    do 
    {
        queue<int> Myqueue;
        Myqueue.push(start);
        graph[start].color = 0;

        while(!Myqueue.empty())
        {
            int gid = Myqueue.front();
            for(int i=0; i<graph[gid].neigh_list.size(); i++)
            {
                int neighid = graph[gid].neigh_list[i];
                if(graph[neighid].color == -1)
                {
                    graph[neighid].color = (graph[gid].color+1)%2; // assign to another group
                    Myqueue.push(neighid);
                }
                else
                {
                    if(graph[neighid].color == graph[gid].color) // touble pair in the same group
                        return false;
                }
            }
            Myqueue.pop();
        }
    } while (!checkAllNodesVisited(graph, numNodes, start)); // make sure all nodes visited 
                                            // to be able to handle several separated graphs, IMPORTANT!!!

    return true;
}

bool checkAllNodesVisited(NODE *graph, int numNodes, int & index)
{
    for (int i=0; i<numNodes; i++)
    {
        if (graph[i].color == -1)
        {
            index = i;
            return false;
        }
    }

    return true;
}