跳转至

SWUST-1065 无向图的连通分量计算(等价于检验图的连通性)

题目描述

假设无向图G采用邻接矩阵存储,编写一个算法求连通分量的个数。

输入

第一行为一个整数n,表示顶点的个数(顶点编号为0到n-1),接下来是为一个n*n大小的整数矩阵,表示图的邻接关系。数字为0表示不邻接,1表示不邻接。

输出

连通分量的个数。

样例输入复制

5
0 1 0 1 1
1 0 1 1 0
0 1 0 1 1
1 1 1 0 1
1 0 1 1 0

样例输出

1

#include <iostream>
#include <vector>

using namespace std;

int num;

void DFS(int s, vector<bool> &vertexVisited, vector<vector<int> > &denseGraph)
{
    for (int i = 0; i < num; ++i){
        if (!vertexVisited[i] && denseGraph[s][i]){
            vertexVisited[i] = true;
            DFS(i, vertexVisited, denseGraph);
        }
    }
}

int connectCheck(vector<bool> &vertexVisited, vector<vector<int> > &denseGraph)
{
    int count = 0;

    for (int i = 0; i < num; ++i){
        if (!vertexVisited[i]){
            DFS(i, vertexVisited, denseGraph);
            ++count;
        }
    }

    return count;
}

int main()
{
    cin >> num;

    vector<int> line(num, 0);
    vector<vector<int> > denseGraph(num, line);
    vector<bool> vertexVisited(num, false);

    for (int i = 0; i < num; ++i){
        for (int j = 0; j < num; ++j){
            cin >> denseGraph[i][j];
        }
    }

    int result = connectCheck(vertexVisited, denseGraph);
    cout << result;

    return 0;
}

唯一值得注意的是由于其编译器比较老,所以在定义矩阵的时候,vector<vector<int> >,两个>之间要有一个空格。

如果是检验图的连通性,则不必计算出count的数值,只需要检验count是否为1,否则就是不连通。