【短学期算法作业】团伙问题(并查集)

简介: 【短学期算法作业】团伙问题(并查集)

题目介绍

团伙问题(并查集)

在城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足:

(1)朋友的朋友是朋友;

(2)敌人的敌人是朋友。

这n个人可以划分为若干个团伙,使得每个团伙中任意两个成员均为朋友。告诉你关于这n个人的m条信息,即某两个人是朋友,或者某两个人是敌人,请你编写一个程序,计算这个城市最多可能有多少个团伙?

Input

输入包含多组数据,对于每组数据:

第1行为n和m,1

以下m行,每行为p、x、y,p的值为0或1,p为0时,表示x和y是朋友,p为1时,表示x和y是敌人。

Output:

对于每组输入数据,输出一个整数,表示这n个人最多可能有几个团伙。

Sample Input

6 4

1 1 4

0 3 5

0 4 6

1 1 2

Sample Output

4


题目思路

利用并查集来维护团伙关系,初始是每个人都是一个团伙,然后遍历输入的每一条关系并处理,如果是朋友则两个团伙合并并做路径压缩,同时团伙数减一。


具体代码

package com.dreamchaser;
import java.util.Scanner;
/**
 * 团伙问题(并查集)
 */
public class test6 {
    /**
     * 记录团伙关系
     */
    static int[] persons;
    static int number;
    /**
     * 人数
     */
    static int n;
    /**
     * 关系数
     */
    static int m;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        m = scanner.nextInt();
        persons=new int[n+1];
        number=n;
        int p,x,y;
        for (int i = 0; i < m; i++) {
            p=scanner.nextInt();
            x=scanner.nextInt();
            y=scanner.nextInt();
            if (p==0){
                if (merge(x,y)!=0){
                    number--;
                }
            }
        }
        System.out.println(number);
    }
    /**
     * 寻找根节点
     *
     * @param i
     * @return
     */
    private static int findUnion(int i) {
        /**
         * 合并集的根
         */
        if (persons[i] != 0) {
            int root = findUnion(persons[i]);
            //路径压缩
            persons[i] = root;
            return root;
        } else {
            return i;
        }
    }
    /**
     * 合并集合
     * 如果两个属于同一个集合则返回null,否则返回根节点
     * @param x
     * @param y
     * @return
     */
    private static int merge(int x, int y) {
        int root1 = findUnion(x);
        int root2 = findUnion(y);
        if (root1 != root2) {
            persons[root2] = root1;
            return root1;
        } else {
            return 0;
        }
    }
}



运行截图

q1.png



相关文章
|
1月前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
3月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
2月前
|
存储 算法 Python
火箭般的提升!学会Python并查集,让你的算法能力飞跃新高度!
火箭般的提升!学会Python并查集,让你的算法能力飞跃新高度!
37 1
|
3月前
|
算法 计算机视觉 Python
Python并查集大揭秘:让你在算法界呼风唤雨,秒杀一切复杂场景!
在编程与算法的广袤天地中,总有一些工具如同神兵利器,能够助你一臂之力,在复杂的问题前游刃有余。今天,我们就来深入探讨这样一件神器——Python并查集(Union-Find),看看它是如何让你在算法界呼风唤雨,轻松应对各种复杂场景的。
82 2
|
2月前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
41 0
|
3月前
|
算法 调度
作业调度算法_先来先服务算法_短作业优先算法_高响应比优先算法
本文介绍了作业调度算法,包括先来先服务(FCFS)、短进程优先(SJF)和高响应比优先(HRRN)算法。通过分析进程的到达时间和所需CPU服务时间,计算进程的开始时间、完成时间、平均周转时间和平均带权周转时间,以评估不同算法的性能。FCFS适合长作业,SJF适合短作业,而HRRN则综合了两者的优点。
141 12
|
4月前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业
|
4月前
|
DataWorks 算法 调度
B端算法实践问题之配置脚本以支持blink批处理作业的调度如何解决
B端算法实践问题之配置脚本以支持blink批处理作业的调度如何解决
51 1
|
19天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
4天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。