字母结点型DSU

2024-01-03 01:40
文章标签 字母 结点 dsu

本文主要是介绍字母结点型DSU,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

字母节点型DSU:
在这里插入图片描述

Solution:

Use a hashmap to store a mapping between the labels of nodes and the labels of their parent nodes. For each item in this hashmap, the key is the label of one node and the value is the label of its parent node.

Code:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class DSU {private Map<String, String> parent;private Map<String, Integer> rank;public DSU(String[][] edges) {parent = new HashMap<>();rank = new HashMap<>();for(String[] edge: edges) {for(String node: edge) {if (!parent.containsKey(node)) {parent.put(node, node);rank.put(node, 0);}}}}public String find(String s) {if(!s.equals(parent.get(s))) {String root = find(parent.get(s));parent.put(s, root);}return parent.get(s);}public void union(String s1, String s2) {String s1R = find(s1);String s2R = find(s2);if(s1R.equals(s2R)) {return;}else{if(rank.get(s1R) < rank.get(s2R)) {parent.put(s1R, s2R);}if(rank.get(s1R) > rank.get(s2R)) {parent.put(s2R, s1R);}else{parent.put(s2R, s1R);rank.put(s1R, rank.get(s1R)+1);}}}public int getConnectedPart() {int connectedPart = 0;for(String key: parent.keySet()) {if(parent.get(key).equals(key)) {connectedPart += 1;}}return connectedPart;}public static void main(String[] args) {String[][] edges = {{"A", "B"}, {"A", "C"}, {"B", "C"}, {"D", "E"}};DSU dsu = new DSU(edges);for(String[] edge: edges) {dsu.union(edge[0], edge[1]);}int connectedPart = dsu.getConnectedPart();System.out.println(connectedPart); // 2}}

这篇关于字母结点型DSU的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/564228

相关文章

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

带头结点的线性链表的基本操作

持续了好久,终于有了这篇博客,链表的操作需要借助图像模型进行反复学习,这里尽可能的整理并记录下自己的思考,以备后面复习,和大家分享。需要说明的是,我们从实际应用角度出发重新定义了线性表。 一. 定义 从上一篇文章可以看到,由于链表在空间的合理利用上和插入、删除时不需要移动等优点,因此在很多场合下,它是线性表的首选存储结构。然而,它也存在某些实现的缺点,如求线性表的长度时不如顺序存储结构的

【hdu】I Hate It(线段树,结点修改求区间最大值)

线段树的模板题,还是二分递归。 #include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vector>#include <queue>#include <set>#include <map>#incl

【hdu】敌兵布阵(线段树,更加结点,区间求和)

最近开始刷线段树,主要围绕notonlysuccess的线段树总结刷。 结点修改还是比较简单的,不需要什么懒惰标记,直接二分递归就可以了。 #include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vecto

兔子--EditText去除下划线和输入字母和数字的限制

在设置密码输入框的时候,只允许输入数字和字母,设置如下属性:  android:digits="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 设置密码不可见(显示小黑点),并去除edittext的获取到焦点时候的下划线, 设置如下:

每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意: 有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。 输出 YES 或者 NO —————— 问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下

LeetCode438. 找到字符串中所有字母异位词(2024秋季每日一题 11)

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s = “cbaebabacd”, p = “abc” 输出: [0,6] 解释: 起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。 起始索引等于 6 的子串是

正则:数字、字母、特殊字符同时存在且长度不小于8位

(?![^a-zA-Z]+$)(?!\D+$)(?![a-zA-Z0-9]+$).{8,}$ 使用示例: function valPasswordFormatNew(){var result = true;var newPsd = jQuery("#newPsd").val();if(newPsd !=""){result = (/(?![^a-zA-Z]+$)(?!\D+$)(?![a-zA

Java中等题-去除重复字母(力扣)

给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的 字典序 最小(要求不能打乱其他字符的相对位置)。 示例 1: 输入:s = "bcabc"输出:"abc" 示例 2: 输入:s = "cbacdcbc"输出:"acdb" 这道题我没有思路,看了官方解题思路之后,思路梳理如下: 注:这道题适合经常复习 用一个数组pice[]来