[SOJ] connect components in undirected graph

题目描述:

输入一个简单无向图,求出图中连通块的数目

输入:

输入的第一行包含两个整数n和m,n是图的顶点数,m是边数。1<=n<=1000,0<=m<=10000。

以下m行,每行是一个数对v y,表示存在边(v,y)。顶点编号从1开始。

题目分析:

利用深度优先搜索寻找连通块数,一趟深度优先搜索为一个连通块,深度优先搜索次数为块数。

#include<iostream>
#include<memory>
using namespace std;

const int MAX=1001;
int edge[MAX][MAX];
int n, m;
int num=0;
bool isvisited[MAX];

void DFS(int current)
{
  for(int i=1;i<=n;i++)
  {
    if(!isvisited[i]&&edge[current][i])
    {
      isvisited[i]=true;
      DFS(i);
    }
  }
}

int main()
{
  cin>>n>>m;

  int a, b;
  
  //初始化 
  memset(edge, 0,sizeof(edge));
  memset(isvisited, false, sizeof(isvisited));

  for(int i=0;i<m;i++)
  {
     cin>>a>>b;
     edge[a][b]=1;
     edge[b][a]=1;
  }

  for(int i=1;i<=n;i++)
  {
     if(!isvisited[i])
     {
        num++;
        isvisited[i]=true;
        DFS(i);
     }
  }

  cout<<num<<endl;
  return 0;
}

  

原文地址:https://www.cnblogs.com/KennyRom/p/6243859.html