题解 | #小A最多会新认识的多少人#
小A最多会新认识的多少人
http://www.nowcoder.com/practice/1fe6c3136d2a45fa8ef555b459b6dd26
//并查集应用 var p=new Array(10001) //聚会人数池 //查找根元素 function findRoot(x){ return x==p[x]?x:p[x]=findRoot(p[x]) } var newFriend=0 var n=parseInt(readline()) var t=parseInt(readline()) var m=parseInt(readline()) //根据聚会总人数缩小线程池,并将每个元素自身的父元素(根元素)设为自身 for (let i = 0; i < n; i++) { p[i]=i } //闭合并查集 for (let i = 0; i < m; i++) { //读取每组数据,并拆分 var a,b var then=readline().split(',') a=then[0] b=then[1] //获取对应根元素 var pa=findRoot(a) var pb=findRoot(b) //如果拆分的元素任意一个与标记元素相同,那就代表我一开始就认识你! if (a==t||b==t) { newFriend-=1 } if (pa!=pb) { //如果拆分元素的两祖先相同则不作合并,否则合并,并以深度大的当作深度小的父元素 //pa的父元素设为pb p[pa]=pb } } for (let i = 0; i < n; i++) { //每个元素都能找到根元素了,那就看看标记元素的根元素和它一不一样,每出现一个一样就代表新认识 if (findRoot(i)==findRoot(t)) { newFriend+=1 } } //最后不得把自己减出去吗? //所以 console.log(newFriend-1)