图的遍历及其连通性

【问题描述】
根据输入的图的邻接矩阵A,判断此图的连通分量的个数。
【输入形式】
第一行为图的结点个数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 <bits/stdc++.h>
using namespace std;
#define MAX 200
typedef struct
{
    int arcs[MAX][MAX];
    int num;
    int flag[MAX*MAX];
} adjmatrix;
adjmatrix G;
void creat(adjmatrix *G)
{
    cin>>(*G).num;
    for(int i=0; i<(*G).num; i++)
    {
        for(int j=0; j<(*G).num; j++)
        {
            cin>>(*G).arcs[i][j];
        }
    }
}
void dfs(int x)     //将所有与点y连接的点标记,认为在一个连通分量
{
    for(int i=0; i<G.num; i++)
    {
        if(G.flag[i]==0&&G.arcs[x][i]==1)
        {
            G.flag[i]=1;
            dfs(i);     //深度优先遍历,递归处理与点i在同一个连通分支的点
        }
    }
}
void depthsearchlink()
{
    int sum=0,i;
    for(i=0; i<G.num; i++)
    {
        if(G.flag[i]==0) //遇到新的连通分支
        {
            G.flag[i]=1;
            dfs(i);//下一个开始
            sum++;
        }
    }
    cout<<sum;
}
int main()
{
    creat(&G);
    depthsearchlink();
    return 0;
}


猜你喜欢

转载自blog.csdn.net/weixin_44355876/article/details/95310897