【数据结构】图的遍历及连通性

问题遇到的现象和发生背景

为什么运行马上就结束了。题目为;
根据输入的图的邻接矩阵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 <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define max 10000

#define True 1
#define False 0
#define Error -1
#define OK 1

//领接矩阵结构
typedef struct ArcNode{
int adj;
}ArcNode;

typedef struct {
int vertex[max];
ArcNode arcs[max][max];
int vexnum;//顶点数和弧数

}AdjMatrix;

int hensaomiao(int i,int visit[],AdjMatrix g)
{
visit[i]=0;
for(int j=0;j<g.vexnum;j++)
{
if(g.arcs[i][j].adj==1&&(visit[j]!=0))
hensaomiao(j,visit,g);
}

}

int bianli(int n,AdjMatrix g)
{
int visit[n];
for(int i=0;i<n;i++)
visit[i]=1;//将所以顶点记录为没有扫描
int sum=0;//用来记录子连通数目
for(int i=0;i<n;i++)
{
if(visit[i]!=0)//说明没有被扫描
{
hensaomiao(i,&visit[i],g);
sum++;
}
}
return sum;
}

int main()
{
int n,i,j;
AdjMatrix g;
scanf("%d",&n);
g.vexnum=n;
for(i=0;i<g.vexnum;i++)
for(j=0;j<g.vexnum;j++)
scanf("%d",&g.arcs[i][j].adj);
int w;
w=bianli(n,g);
printf("%d",w);
return 0;

}

运行结果及报错内容

什么也没有直接结束

我的解答思路和尝试过的方法

我感觉是函数部分写错了,但是不知道怎么改。

我想要达到的结果

给你做出来了

img


#include<iostream>
using namespace std;
#define Maxsize 1024      //定义全局变量 数组visit[]
int visit[Maxsize];
typedef struct Graph
{
    int a[64][64];        //建立邻接矩阵  Graph图类型
}Graph;               
void Creat(int n,Graph *s)
{
    int i, j;
    for ( i = 0; i < n; i++)
    {
        for ( j = 0; j < n; j++)    //双循环 写入Graph s
        {
            cin >> s->a[i][j];
        }
    }
}
void Dfs(Graph *s,int visit[],int i,int n)  //此处传参i为行值 
{
    visit[i] = 1;      //设标记 已访问过
    for (int j = 0; j < n; j++)         //内部循环(列) 寻找是否和行点有通路
    {
        if (!visit[j]&&s->a[i][j]==1)
            //如果AB两点之间都没有被访问过 并且 A点和 A B C D点之间有连通
        {
            Dfs(s, visit, j, n);    //继续搜索
        }
    }
}           //此处Dfs搜索的意义在于:将访问过(可联通的)点做标记,通过调用外部一次性bfs的次数 判断连通分量的个数
 
 
void Makevisit(Graph *s,int visit[],int n)
{
    int i, f = 0;
    for (i = 0; i < n; i++)
        visit[i] = 0;            //初始化辅助数列
    for (i = 0; i < n; i++)     //外部循环是从第一个点(行上的点)(若访问过则不再访问)
    {        // (确保所有的点都要访问,才能准确的判断连通分量个数)
        if (!visit[i])           //判断该点是否遍历过 若未遍历过 则进入
        { 
            f++;                  
            Dfs(s, visit, i, n);    
                  //调用搜索的次数 即为连通分量的个数
        }
    }
        cout << f;
}
 
int main()
{
    int n;  
    Graph *s=NULL;           //表s初始化为空
    s = new Graph[64];       //给表s赋值空间
    cin >> n;
    Creat(n,s);              //创建表
    Makevisit(s, visit, n);  //搜索
    return 0;
}