纯粹的热爱 2022-06-04 12:49 采纳率: 60%
浏览 325

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

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

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

}

运行结果及报错内容

什么也没有直接结束

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

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

我想要达到的结果
  • 写回答

1条回答 默认 最新

  • 吕布辕门 后端领域新星创作者 2022-06-04 13:20
    关注

    给你做出来了

    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;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 6月4日

悬赏问题

  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错
  • ¥15 拓扑学,凸集,紧集。。
  • ¥15 如何扩大AIS数据容量