链接:https://www.nowcoder.com/questionTerminal/1fe6c3136d2a45fa8ef555b459b6dd26
来源:牛客网
小A参加了一个n人的活动,每个人都有一个唯一编号i(i>=0 & i<n),其中m对相互认识,在活动中两个人可以通过互相都认识的一个人介绍认识。现在问活动结束后,小A最多会认识多少人?
输入描述:
第一行聚会的人数:n(n>=3 & n<10000); 第二行小A的编号: ai(ai >= 0 & ai < n); 第三互相认识的数目: m(m>=1 & m < n(n-1)/2); 第4到m+3行为互相认识的对,以','分割的编号。
输出描述:
输出小A最多会新认识的多少人?
示例1
输入
7 5 6 1,0 3,1 4,1 5,3 6,1 6,5
输出
3
分析:vector<int>mp[]标记两个人是否相互认识(0/1),vis[]标记这个人小A是否认识,栈q存放小q认识的人,st记录小A刚开始认识的人,ans记录栈q下小A认识的人,由于栈q时重复计算了小A本身,所以结果-1
#include<iostream>
#include<cmath>
#include<cstdio>
#include<stack>
#include<vector>
using namespace std;
int main()
{
int n, t, m;
int vis[10000]={0};///小A是否认识这个人
vector<int>mp[10000];
cin>>n>>t>>m;
int a,b;
stack<int>q;
while(!q.empty())q.pop();
int st = 0;
while(m--)
{
scanf("%d,%d", &a, &b);
mp[a].push_back(b);
mp[b].push_back(a);
if(a==t||b==t)
{
st++;
}
}
q.push(t);
int ans = 0;
while(!q.empty())///查找小A认识的人 所认识的人
{
int x = q.top();
vis[x] = 1;
ans++;
q.pop();
for(int i = 0; i < mp[x].size(); i++)
{
if(vis[mp[x][i]]==0)///这个人是不是小A认识的
{
vis[mp[x][i]] = 1;
q.push(mp[x][i]);
}
}
}
cout<<ans-st-1<<endl;
return 0;
}