首页 > 其他分享 >并查集应用:判圈

并查集应用:判圈

时间:2024-11-04 21:16:04浏览次数:5  
标签:java 判圈 NO int 查集 util 应用 sc import

并查集应用:判圈

Description

第一行输入正整数n,m,q表示一个有n个点m条边的无向图。q表示有q次询问。

接下来m行有m条边。每行两个u,v属于[1,n]范围的正整数,表示u,v之间有边。

接下来q行,每行两个点u,v,属于[1,n]。

如果(u,v)这条边已经存在或者如果加入这条边后会产生新的环,则输出一行YES,否则输出NO

Sample Input 1 

5 3 3
1 2
2 3
3 1
1 2
3 4
4 5

Sample Output 1

YES
NO
NO

来源:oj作业三


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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int q = sc.nextInt();
        
        UnionFind unionfind= new UnionFind(n);
        Set<String> edge= new HashSet<>();//hashSet存放边集
        
        for(int i=1;i<=m;i++) {
        	int u=sc.nextInt();
        	int v=sc.nextInt();
        	edge.add(u+","+v);
        	edge.add(v+","+u);//无向图记得反向
        	unionfind.union(u, v);//加入并查集
        }
        
        for(int i=1;i<=q;i++) {
        	int u=sc.nextInt();
        	int v=sc.nextInt();
        	if(edge.contains(u+","+v)) {
        		System.out.println("YES");
        	}
        	else if(unionfind.find(u)==unionfind.find(v)) {
        		System.out.println("YES");
        	}
        	else {
        		System.out.println("NO");
        	}
        }
       
    }
}

//并查集
class UnionFind{
	private int[] parent;
	private int[] rank;//树高,用于减少递归次数
	
	public UnionFind(int n) {
		parent = new int[n+1];
		rank = new int[n+1];
		for(int i=1;i<=n;i++) {
			parent[i]=i;//初始每个节点的祖先节点都是自己
			rank[i]=1;//初始树高为1
		}
	}
	
	//查通过递归父节点,找到祖先节点,如果祖先节点是自己,说明是环
	public int find(int u) {
		if(parent[u]!=u) {
			parent[u]=find(parent[u]);
		}
		return parent[u];
		}

	public void union(int u,int v) {
		int rootU=find(u);
		int rootV=find(v);
		//为了维持树高,哪里的树更矮,就作为父节点
		if(rootU!=rootV) {
			if(rank[rootU]>rank[rootV]) {
				parent[rootV]=rootU;
			}else if(rank[rootU]<rank[rootV]) {
				parent[rootU]=rootV;
			}else {
				parent[rootV]=rootU;
				rank[rootU]++;
			}
		}
	}
	
}

标签:java,判圈,NO,int,查集,util,应用,sc,import
From: https://blog.csdn.net/m0_74074965/article/details/143494284

相关文章

  • 【linux应用】在Linux里如何把一个已经登录的用户踢出去
    原创老段工作室我在两个终端下都用tom登录了vms72这台机器一个是直接在虚拟机控制台登录的,下图1的位置,终端编号为tty1另一个是通过xshell登录的,下图标记为2的位置,终端编号为pts/0断开一个用户的会话的语法是:pkill-kill-t终端编号所以我现在想把虚拟机里的那个tom登......
  • 育种 4.0 与人工智能在作物改良中的应用概述
    植物育种历经数千年演变,从古代的基础选择策略发展到如今的育种4.0阶段,旨在增强作物多样性和保障粮食安全。面对气候变化、人口增长和耕地有限等挑战,人工智能(AI)成为关键解决方案。本综述探讨了植物育种的历史进程,阐述了AI在作物改良各方面的应用及其重要作用,强调了其对培育适应全球......
  • 在路由引入时应用路由策略示例
    组网需求RouterB与RouterA之间通过OSPF协议交换路由信息,与RouterC之间通过IS-IS协议交换路由信息。要求在RouterB上将IS-IS网络中路由引入到OSPF网络后,OSPF网络中路由172.16.1.0/24的选路优先级较低;路由172.16.2.0/24具有标识,方便以后运用路由策略。配置思路采用如下的......
  • 国标GB28181设备管理软件EasyGBS国标GB28181公网平台创新应用
    在当今数字化时代,视频监控技术在各个领域发挥着至关重要的作用。随着科技的不断进步GB28181标准的广泛应用为视频监控系统带来了更高的兼容性和稳定性。而国标GB28181公网平台EasyGBS作为一款基于GB28181标准的视频监控平台,正以其强大的功能和创新的应用,为用户带来全新的监控体......
  • 国标GB28181网页直播平台EasyGBS国标GB28181软件与GB28181应用场景分析
    随着5G、AI、云计算、大数据、物联网等新兴技术的快速发展,各行各业都在积极探索智能化、现代化的管理与运营模式。国标GB28181网页直播平台EasyGBS作为一款基于国标GB28181协议的视频云服务平台,凭借其强大的功能和广泛的应用场景,在众多领域中展现出了独特的优势。一、EasyGBS......
  • 前端数据持久化指南:LocalStorage、SessionStorage 等的区别与应用
    一、引言在前端开发中,数据持久化是一个至关重要的需求。它能够确保用户在不同页面切换、刷新页面或者关闭浏览器后,数据仍然能够被保存和恢复。本文将详细介绍几种实现前端数据持久化的方法,并深入分析它们之间的区别。二、实现前端数据持久化的方法(一)LocalStorage介绍:LocalS......
  • C语言链表深入解析:实现与应用
    ###标题:C语言链表深入解析:实现与应用---####正文:链表是计算机科学中重要的数据结构,因其灵活性和动态性而被广泛使用。本文将探讨链表的基本概念、实现方法以及一些常见的操作,帮助你全面掌握这一基础数据结构。---###一、链表概述链表由一系列节点组成,每个节点包含数据......
  • 基于FPGA的可控分频器设计与应用
    ###标题:基于FPGA的可控分频器设计与应用---####正文:可控分频器在数字电路中扮演着重要角色,尤其是在频率合成和时钟管理方面。基于FPGA的实现不仅灵活且易于修改,本文将详细介绍如何设计和实现一个可控分频器,并展示其应用实例。---###一、可控分频器的基本概念可控分频......