C ++查找连接组件的数量(BFS,邻接矩阵)

时间:2012-11-03 20:48:35

标签: c++ matrix components

大家好,我正在为我的图形(邻接矩阵)创建函数,以使用广度优先搜索算法返回连接组件的数量。

它几乎正常工作。如果组件数等于顶点数,则返回正确的值,但如果组件数小于它返回的顶点数(正确值+1)。我不知道如何解决它,所以如果你能看一看并告诉我,我会很高兴。下面是代码的链接,它看起来比http://wklej.org/id/861341/

下面的代码更合适
int Graph::getNumberOfConnectedComponents()
{
    int components=0;
    queue<int> S;
    int n = getVerticesCount();//as name indicates it returns number of vertices in graph
    bool* visited = new bool[n];
    for(int i=1;i<n;i++)
        visited[i]=false;

    visited[0]=true;
    S.push(0);
    while(!S.empty())
    {
        int v = S.front();
        S.pop();
        list<int> x = getNeighbors(v);//as name indicates this function returns list of neighbours of given vertice
        if(!x.empty())
        {
            list<int>::iterator it;
            for (it=x.begin(); it!=x.end(); it++)
            {
                if(visited[*it]==false)
                {
                    S.push(*it);
                    visited[*it]=true;
                }
            }
        }

        if(S.empty())
        {
            components++;
            for(int i=1;i<n;i++)
            {
                if(visited[i]==false)
                {
                    S.push(i);
                    visited[i]=true;
                    break;
                }
            }
        }
    }

    return components;
}

我在评论中解释了这些功能的作用,希望你能帮助我:/。顺便说一句,如果你改变组件的位置++;并将其放入if(visited [i] == false)它为所有图形提供适当的值,除了那些组件数量=顶点数量(对于那些值为“适当值-1”)。

@Edit 1,这是这个函数john

list<int> AdjacencyMatrixGraph::getNeighbors(int v)
 {
     list<int> x;
     if(v==0||v>=n)
     return x;

     for(int j=0;j<n;j++)
     {
     if(matrix[v][j]!=0)
         x.push_front(j);
     }
     return x;
 }

1 个答案:

答案 0 :(得分:1)

list<int> AdjacencyMatrixGraph::getNeighbors(int v)
 {
     list<int> x;
     if(v==0||v>=n)
     return x;

应该是

list<int> AdjacencyMatrixGraph::getNeighbors(int v)
 {
     list<int> x;
     if(v<0||v>=n)
     return x;
据我所知,

顶点0可以有邻居。