题目描述:
输入一个简单无向图,求出图中连通块的数目
输入:
输入的第一行包含两个整数n和m,n是图的顶点数,m是边数。1<=n<=1000,0<=m<=10000。
以下m行,每行是一个数对v y,表示存在边(v,y)。顶点编号从1开始。
#include "iostream"
#include "memory.h"
using namespace std;
const int MAX = 1001;
int edge[MAX][MAX]; //记录边
int n,m; //顶点数,边数
int ans; //连通块数
bool isvisted[MAX]; //记录一个点是否走过
void dfs(int current){
for(int i = 1; i <= n; i++){
if (!isvisted[i] && edge[current][i]){
isvisted[i] = true;
dfs(i);
}
}
}
int main(int argc, char *argv){
cin >> n >> m;
memset(edge, 0, sizeof(edge));
memset(isvisted, false, sizeof(isvisted));
ans = 0;
for (int i = 0; i < m; i++){
int a, b;
cin >> a >> b;
edge[a][b] = 1;
edge[b][a] = 1;
}
for (int i = 1; i <= n; i++){
if (!isvisted[i]){ //如果该起点没走过,则说明这是一个新的连通块
ans++;
isvisted[i] = true;
dfs(i);
}
}
cout << ans << endl;
return 0;
}