Adding Exits to a Maze

求无向图的连通分量的个数

May 16, 2017

题目链接:pdf

给出一个无向图,求连通分量的个数。对这个图做一遍DFS同时计数就好了。因 为我用邻接表表示图,所以还要记得孤点的情况,这个后来才发现。

// Begin: Fri May 12 19:52:46 CST 2017
// Finish: Fri May 12 20:16:44 CST 2017


// 求有几个连通块。。

#include <iostream>
#include <vector>

using namespace std;

void
dfs(vector<vector<int> > &adj, vector<bool> &visit, int x)
{
  visit[x] = true;

  for (size_t i = 0; i < adj[x].size(); ++i) {
    if (!visit[adj[x][i]]) {
      dfs(adj, visit, adj[x][i]);
    }
  }

}

int number_of_components(vector<vector<int> > &adj, int n) {
  int res = 0;
  vector<bool> visit(n, false);

  // 所以我忘了孤点。。。。T_T
  
  for (size_t i = 0; i < adj.size(); ++i) {
    for (size_t j = 0; j < adj[i].size(); ++j) {
      if (!visit[adj[i][j]]) {
	res++;
	dfs(adj, visit, adj[i][j]);
      }
    }
  }

  // 加上孤点。。。。
  for (int i = 0; i < n; ++i) {
    if (!visit[i]) res++;
  }


  return res;
}

int main() {
  size_t n, m;

  cin >> n >> m;
  // while(std::cin >> n >> m) {
    vector<vector<int> > adj(n, vector<int>());
    
    for (size_t i = 0; i < m; i++) {
      int x, y;
      std::cin >> x >> y;
      adj[x - 1].push_back(y - 1);
      adj[y - 1].push_back(x - 1);
    }
    
    std::cout << number_of_components(adj, n) << endl;
  // }
}

comments powered by Disqus