消息传递题解
题目:
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;
}