连通分量即为连通子图的个数。
用一个flag数组来存放每个点的标记0
点i从0-n,每次遇到flag[]==0计数器++,每次将与点I邻接的点J进行标记,然后采用深度优先搜索的方式递归得标记与J邻接的点,最后与I在同一个连通分支的点均被标记,i往后走遇到有flag[]==0,说明有新的连通分支,于是进行相同的处理
#include<iostream>
using namespace std;
int n;
int g[105][105];
int flag[1005];
void dfs(int y) //将与点y连接的点标记,认为在一个连通分量
{
for(int i=0;i<n;i++)
{
if(flag[i]==0&&g[y][i]==1)
{
flag[i]=1;
dfs(i); //递归处理与点i在同一个连通分支的点
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>g[i][j];
int sum=0;
for(int i=0;i<n;i++)
{
if(flag[i]==0) //遇到新的连通分支
{
sum++;
flag[i]=1; //记得先标记自身
dfs(i);
}
}
cout<<sum;
return 0;
}
学校oj上直接输出1也是可以ac的哦/xyx