部落(pta)(并查集) Java以及C++

简介: 部落(pta)(并查集) Java以及C++

题目描述:

在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同一个部落。

输入格式:

输入在第一行给出一个正整数N(≤10

4

),是已知小圈子的个数。随后N行,每行按下列格式给出一个小圈子里的人:

K P[1] P[2] ⋯ P[K]

其中K是小圈子里的人数,P[i](i=1,⋯,K)是小圈子里每个人的编号。这里所有人的编号从1开始连续编号,最大编号不会超过10

4

之后一行给出一个非负整数Q(≤10

4

),是查询次数。随后Q行,每行给出一对被查询的人的编号。

输出格式:

首先在一行中输出这个社区的总人数、以及互不相交的部落的个数。随后对每一次查询,如果他们属于同一个部落,则在一行中输出Y,否则输出N。

输入样例:

4

3 10 1 2

2 3 4

4 1 5 7 8

3 9 6 4

2

10 5

3 7

输出样例:

10 2

Y

N

解题思路:

利用并查集,用set集合存放数据

代码:

java(超时)

package text2;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class 部落 {
  static int p[] = new int[10005];
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    for(int i=0;i<10005;i++)
      p[i] = i;
    Set<Integer> numberS = new HashSet<Integer>();
    Set<Integer> numberP = new HashSet<Integer>();
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    for(int i=0;i<n;i++) {
      int p = scanner.nextInt();
      int f = scanner.nextInt();
      numberS.add(f);
      for(int j=1;j<p;j++) {
        int t = scanner.nextInt();
        numberS.add(t);//加入总人数的集合
        Union(f, t);//合并
      }
    }
    System.out.print(numberS.size()+" ");
    for(Integer s:numberS) {
      numberP.add(Find(s));
    }
    System.out.println(numberP.size());
    int m = scanner.nextInt();
    for(int i=0;i<m;i++) {
      int a = scanner.nextInt();
      int b = scanner.nextInt();
      if(Find(a)==Find(b))
        System.out.println("Y");
          else
            System.out.println("N");  
    }
  }
  //找祖先
  public static int Find(int a) {
    if(p[a]!=a) {
      return Find(p[a]);
    }
    return p[a];
  }
//合并两个点的祖先
  public static void Union(int a,int b) {
    a = Find(a);
    b = Find(b);
    if(a!=b) {
      p[a]=b;
    }
  }
}

C++(AC):

#include<iostream>
#include<algorithm>
#include<stack>
#include<set>
#define inf 0x3f3f3f3f
using namespace std;
int par[10005];

void init(){
    for(int i=0;i<10000;i++){
        par[i]=i;
    }
}

int findEle(int a){        //找到祖先
    if(a!=par[a]){
        return par[a]=findEle(par[a]);
    }
    return par[a];
}

void unionEle(int a,int b){   //合并两个点
    a=findEle(a);
    b=findEle(b);
    if(a!=b)
        par[a]=b;
}
int main()
{
    int n,q;
    cin>>n;
    init();
    set<int>st;
    set<int>stt;
    for(int i=0;i<n ;i++){
        int k;
        cin>>k;
        int a[10005];
        cin>>a[0];
        st.insert(a[0]);
        for(int j=1;j<k;j++){
            cin>>a[j];
            st.insert(a[j]);
            unionEle(a[0],a[j]);
        }
    }
    cout<<st.size()<<" ";
    for(auto it=st.begin();it!=st.end();it++){
        stt.insert(findEle(*it));
    }
    cout<<stt.size()<<endl;
    cin>>q;
    for(int i=0;i<q;i++){
        int a,b;
        cin>>a>>b;
        if(findEle(a)==findEle(b))
            cout<<"Y"<<endl;
        else
            cout<<"N"<<endl;   
    }
    system("pause");
    return 0;
}

目录
相关文章
|
1月前
|
jenkins Shell 测试技术
|
1月前
|
安全 jenkins Java
Java、Python、C++支持jenkins和SonarQube(一)
Jenkins 是一个开源的 持续集成(CI)和持续交付(CD) 工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
151 5
|
1月前
|
jenkins Java Shell
Java、Python、C++支持jenkins和SonarQube(全集)
Jenkins 是一个开源的持续集成(CI)和持续交付(CD)工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
196 1
|
1月前
|
jenkins Java 持续交付
|
1月前
|
jenkins Java 测试技术
|
4月前
|
算法 Java 数据库连接
Java 与 C++ 区别深入剖析及应用实例详解
本文深入剖析了Java和C++两种编程语言的区别,从编译与执行机制、面向对象特性、数据类型与变量、内存管理、异常处理等方面进行对比,并结合游戏开发、企业级应用开发、操作系统与嵌入式开发等实际场景分析其特点。Java以跨平台性强、自动内存管理著称,适合企业级应用;C++则因高性能和对硬件的直接访问能力,在游戏引擎和嵌入式系统中占据优势。开发者可根据项目需求选择合适语言,提升开发效率与软件质量。附面试资料链接:[点此获取](https://pan.quark.cn/s/4459235fee85)。
392 0
|
10月前
|
Java Android开发 C++
Java和C++
Java和C++
188 15
|
12月前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
103 5
WK
|
11月前
|
安全 Java 编译器
C++和Java哪个更好用
C++和Java各具优势,选择取决于项目需求、开发者偏好及目标平台特性。C++性能出色,适合游戏、实时系统等;Java平台独立性强,适合跨平台、安全敏感应用。C++提供硬件访问和灵活编程范式,Java有自动内存管理和丰富库支持。两者各有千秋,需根据具体需求选择。
WK
294 1
|
缓存 并行计算 Java
C++矢量运算与java矢量运算
本文探讨了C++和Java中的矢量运算与标量运算的性能比较,解释了矢量运算的原理和为什么它比标量运算快,包括并行性、数据局部性、指令优化和数据重用等优势。文章还提供了C++和Java的矢量运算示例代码,并展示了运行结果,以证明矢量运算在处理大量数据时的性能优势。
240 0
C++矢量运算与java矢量运算