Description
n位学员,1到n编号,有的有好友关系(双向),从1号开始将消息传给所有Ta认识的人,知道消息的人也会继续将消息传给所有Ta认识的人,问最后有多少人知道这消息.
Sample Input
6 5
1 2
2 3
4 2
3 4
6 5
Sample Output
4
【样例说明】
1传给2,3.因为2,3都是4好友,所以4也会知道
解题思路:
本题从1号开始,递归模拟消息传递的过程.
Code:
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
vector<int>v[10001];//存储关系,用vector防止空间浪费
bool f[10001];//记录编号为i的是否知道
void Dfs(int p){//递归实现"得知并转发"这一过程
if(f[p])//已经知道并转发
return;
f[p]=1;//现在已知道
for(int i=0;i<v[p].size();i++)
Dfs(v[p][i]);//向其所有好友转发
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1,a,b;i<=m;i++)
scanf("%d%d",&a,&b),v[a].push_back(b),v[b].push_back(a);//a,b互相加好友
Dfs(1);//从1号学员发出
for(int i=1;i<=n;i++)
if(f[i])
ans++;//统计答案
printf("%d\n",ans);
}