题目:
微信朋友圈出了扩大版。其中好友分为直接好友和间接好友。和你有直接好友关系的是你的直接好友,你的直接好友的好友都是你的间接好友。所有互为好友的人共同构成了一个朋友圈,圈里每个人都其他人的直接或间接的好友。
已知微信用户共有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(