题目描述
小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
一道非常常规的集合题,本人认为我这个aknow的设置还是很灵性的】
#include<iostream>
#include<memory.h>
using namespace std;
int root[10006];
void unionr(int a, int b){
root[a] = b;
}
int findroot( int v ){
if( root[v] == v ) return v;
else return root[v] = findroot(root[v]);
}
int main(){
int n,ai,m;
cin >> n >> ai >> m;
for( int i = 0 ; i < n ; i ++ ) root[i] = i;
int aknow = 0;
for( int i = 0 ; i < m ; i ++ ){
int a,b;
scanf("%d,%d",&a,&b);
if( a == ai || b == ai) aknow--;
unionr(findroot(a),findroot(b));
}
int aroot = findroot(ai);
for( int i = 0 ; i < n; i ++ )
if( findroot(i) == aroot && i != ai ) aknow++;
printf("%d",aknow);
return 0;
}
0 条评论