题目描述:
输入一个简单无向图,求出图中连通块的数目
输入:
输入的第一行包含两个整数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; }