数据结构作业4——图的DFS等获得连通分量

题目:

微信朋友圈出了扩大版。其中好友分为直接好友和间接好友。和你有直接好友关系的是你的直接好友,你的直接好友的好友都是你的间接好友。所有互为好友的人共同构成了一个朋友圈,圈里每个人都其他人的直接或间接的好友。
已知微信用户共有N位,以及他们之间的直接好友关系,请你找出总共形成了多少个扩大版朋友圈。
输入格式
第一行输入两个整数N(1<=N<=1000),M(0<=M<10000),分别表示微信用户的人数、他们之间的直接好友关系的数目。
接下来有M行输入,每行输入两个整数x(1<=x<=N)、y(1<=y<=N),表示用户x和用户y是直接好友。
输出格式
输出一个整数,表示形成的朋友圈的数目。
样例输入
6 4
1 2
2 3
3 4
5 6
样例输出
2

初步计划:
使用邻接矩阵存储这个图,并且通过DFS(或BFS、并查集)遍历得到连通分量的数量。

第一版(参考王道数据结构的DFS代码):

 代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

int* visited; //设置visited矩阵,初始为0,被访问的变为1
int M = 0, N = 0; //N为微信用户人数,M为这些人中直接好友关系的数目
int main()
{
    int p, q; //debug
    int con_comp = 0;
    printf("输入N、M\n"); //debug
    scanf("%d %d", &N, &M);
    visited = (int*)malloc(N * sizeof(int));
    int connect[N][N]; //设置邻接矩阵存储图
    int x = 0, y = 0; //x和y为输入的connect矩阵的1值
    memset(connect, 0x00, sizeof(int) * N * N);
    for(int i = 0; i < M; i++)
    {
        printf("输入%d\n", i); //debug
        scanf("%d %d", &x, &y);
        connect[x][y] = 1;
        connect[y][x] = 1;
    }
    //debug >>>
    printf("the connected matrix:\n");
    for(p = 0; p < N; p++)
    {
        for(q = 0; q < N; q++)
        {
            printf("%d ", connect[p][q]);
        }
        printf("\n");
    }
    //debug <<<
    memset(visited, 0x00, N * sizeof(int));
    con_comp = dfsTravel(connect);
    printf("%d", con_comp);
}

int dfsTravel(int** connect)
{
    int con_comp = 0;
    int i = 0;
    for(i = 0; i < N; i++)
    {
        if(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值