【问题描述】
根据输入的图的邻接矩阵A,判断此图的连通分量的个数。请使用邻接矩阵的存储结构创建图的存储,并采用BFS优先遍历算法实现,否则不得分。
【输入形式】
第一行为图的结点个数n,之后的n行为邻接矩阵的内容,每行n个数表示。其中A[i][j]=1表示两个结点邻接,而A[i][j]=0表示两个结点无邻接关系。
【输出形式】
输出此图连通分量的个数。
【样例输入】
5
0 1 1 0 0
1 0 1 0 0
1 1 0 0 0
0 0 0 0 1
0 0 0 1 0
【样例输出】
2
【样例说明】
邻接矩阵中对角线上的元素都用0表示。(单个独立结点,即与其它结点都没有边连接,也算一个连通分量)
#include<iostream>
#include<queue>
using namespace std;
#define MAX 1000
#define MAX_NUM 100
typedef struct Graph
{
char vertex[MAX_NUM];
int arcs[MAX_NUM][MAX_NUM];
int vertexs,brim;
}Graph;
int visited[MAX]={0};
void CreateGraph(Graph &g)
{
int i,j;
cin>>g.vertexs;
for(int i=0;i<g.vertexs;i++)
{
for(int j=0;j<g.vertexs;j++)
{
cin>>g.arcs[i][j];
}
}
}
void BFS(Graph g,int v)
{
visited[v]=1;
int w;
queue<int> q;
q.push(v);
while(!q.empty())
{
v=q.front();
q.pop();
for(int i=0;i<g.vertexs;i++)
{
if(g.arcs[v][i]!=0&&visited[i]!=1)
{
BFS(g,i);
}
}
}
}
int main()
{
Graph g;
int i,sum=0;
CreateGraph(g);
for(i=0;i<g.vertexs;i++)
{
if(visited[i]!=1)
{
BFS(g,i);
sum++;
}
}
cout<<sum<<endl;
return 0;
}