试题 与1连通的点的个数
输入格式
输入的第一行包含两个整数n, m
n代表图中的点的个数,m代表边的个数
接下来m行,每行2个正整数,表示图中连通的两点。
输出格式
输出1个数,与1连通的点的个数。
样例输入
6 3
1 2
2 3
3 4
样例输出
4
【思路】:由于数据量大,不适合用邻接矩阵存储,用邻接表实现为宜
/**
6 4
1 3
3 4
3 5
5 6
**/
#include<stdio.h>
#include<stdlib.h>
#define MAX 10005
typedef struct Node{
int val;
Node *next = NULL;
} Node;
int vis[MAX];
int tra[MAX];
int max = 0;
//对邻接表进行头插
void insert(int d1, int d2, Node* arr){
Node *p = (Node*)malloc(sizeof(Node));
p->val = d2;
p->next = arr[d1].next;
arr[d1].next = p;
}
//遍历
void dfs(int idx, int num, Node* arr){
Node *p = arr[idx].next;
while(p != NULL){
int idx = p->val;
if(vis[idx] != 1){
vis[idx] = 1;
tra[idx] = 1;
dfs(idx, num + 1, arr);
vis[idx] = 0;
}
p = p->next;
}
}
//销毁邻接表
void destroy(int n, Node* arr){
for(int i = 0;i <= n;i++){
Node *p = arr[i].next;
while(p != NULL){
Node *temp = p->next;
free(p);
p = temp;
}
}
}
int main()
{
tra[1] = 1;
int n = 0, m = 0;
scanf("%d %d", &n, &m);
//初始化
Node *arr = (Node*)malloc((n + 1) * sizeof(Node));
for(int i = 0;i <= n;i++){
arr[i].next = NULL;
arr[i].val = 0;
}
//输入每一条边
for(int i = 0;i < m;i++){
int d1, d2;
scanf("%d %d", &d1, &d2);
insert(d1, d2, arr);
insert(d2, d1, arr);
}
Node *p = arr[1].next;
int cnt = 0;
dfs(1,1,arr);
destroy(n, arr);
free(arr);
int max = 0;
for(int i = 1;i <= n;i++){
if(tra[i] == 1){
max++;
}
}
printf("%d\n", max);
return 0;
}