消息传递题解

· · 个人记录

题目:

Description

NOI班有n位学员,因为相处时间有限,有的学员之间加了微信,有的学员之间没有。假设加微信的关系是相互的, 即如果a加了b的微信,b也会加a的微信。现在有一条NOI班上的爆炸性的新闻从1号学员发出,每个看到这个新闻的 NOI班学员都会在朋友圈转发,而加了他微信的朋友都会看到。没有在NOI班上的学员都不会转发(因为和自己关系 不大)。告诉你NOI班上的学员之间的微信好友关系,请问最终有多少个学员看到这则新闻。

Input 输入的第一行包含两个整数,第一个整数n,表示学员的数量。学员从1到n编号。 第二个整数m,表示有m对人加了微信好友 接下来m行,每行两个整数a, b,用一个空格分隔,表示这两个编号的学员之间加了微信好友。

1 <= n <= 1000, 1 <= m <= 10000

Output

输出一个整数,表示最终有多少个学员看到了这则新闻。

思路:

其实就是图的遍历,把图存起来dfs遍历一遍即可

代码


#include<bits/stdc++.h>
using namespace std;
vector<int>arr[1001];//vector暴力存图法
bool f[1001];//记录每个点有没有被遍历到,即每个人能不能收到消息
int n,m;
void read(int &x) {//快读
    char ch; bool ok;
    for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
    for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
void dfs(int p) {
    if(f[p])return;如果这这点已经被走过了,就不要再进行dfs了
    else f[p]=true;//否则就打上标记
    for(int i=0; i<arr[p].size(); i++)
        dfs(arr[p][i]);//遍历
}
int main() {
    read(n),read(m);
    int a,b;
    for(int i=1; i<=m; i++) {
        read(a),read(b);
        arr[a].push_back(b);
        arr[b].push_back(a);//读入,存图
    }
    dfs(1);
    int ans=0;
    for(int i=1; i<=n; i++)
        if(f[i])
            ans++;
    printf("%d",ans);//输出答案
    return 0;
}