LintCode 805: Maximum Association Set (并查集和BFS好题)

图论(一):DFS,BFS,邻接链表,并查集 本文总结了图的深度优先搜索,图的广度优先搜索,邻接链表和邻接矩阵的实现,并查集的实现。 0),预备知识         基础词汇:有向图,无向图,带权有向图,带权无向图,有向图中:即Vi--->Vj,弧尾--->弧头,无向图中相邻记为(Vi, Vj),顶点有穷集合V+边的有穷集合E。         图的两种实现方式:1,邻接矩阵:edge[n][n]表示有n个结点,数组内容为权值大小或者是 阅读详情
  1. Maximum Association Set

Amazon sells books, every book has books which are strongly associated with it. Given ListA and ListB,indicates that ListA [i] is associated with ListB [i] which represents the book and associated books. Output the largest set associated with each other(output in any sort). You can assume that there is only one of the largest set.

Example
Example 1:
Input: ListA = [“abc”,“abc”,“abc”], ListB = [“bcd”,“acd”,“def”]
Output: [“abc”,“acd”,“bcd”,“def”]
Explanation:
abc is associated with bcd, acd, dfe, so the largest set is the set of all books

Example 2:
Input: ListA = [“a”,“b”,“d”,“e”,“f”], ListB = [“b”,“c”,“e”,“g”,“g”]
Output: [“d”,“e”,“f”,“g”]
Explanation:
The current set are [a, b, c] and [d, e, g, f], then the largest set is [d, e, g, f]
Notice
The number of books does not exceed 5000.

解法1:并查集
首先把A和B中的每本书按globalId编号。
然后union find,最后查每本书的find(x),找出某个祖宗其拥有最多本书。
注意:
1)并查集使用的关键之处就是搞清楚什么时候用father[x],什么时候用find(x)。
find(x)的返回值就是x当前情况下的最高祖宗,在find(x)的过程中,最后father[x]也指向了其当前情况下的最高祖宗。
在merge()过程结束后,可能仍有某些书的father没有指向真正的最高祖宗。所以在接下来的循环中,
for (int i = 0; i < globalIdMax; ++i) {
int fx = find(i); //not father[i]!
在find(x)中,father[x]已经指向其最高祖宗了。
所以在接下来的匹配maxId中,用father[i]而不是find(i)就可以了。

        for (int i = 0; i < globalIdMax; ++i) {
            if (father[i] == maxId) {
                res.push_back(id2Book[i]);
            }
        }

代码如下:

class Solution {
public:
    /**
     * @param ListA: The relation between ListB's books
     * @param ListB: The relation between ListA's books
     * @return: The answer
     */
    vector<string> maximumAssociationSet(vector<string> &ListA, vector<string> &ListB) {
        int n = ListA.size();
        
        for (int i = 0; i < n; ++i) {
            if (book2Id.find(ListA[i]) == book2Id.end()) {
                book2Id[ListA[i]] = globalId;
                id2Book[globalId] = ListA[i]; 
                globalId++;
            }
        }
        
        for (int i = 0; i < n; ++i) {
            if (book2Id.find(ListB[i]) == book2Id.end()) {
                book2Id[ListB[i]] = globalId;
                id2Book[globalId] = ListB[i]; 
                globalId++;
            }
        }

        int globalIdMax = globalId;
        father.resize(globalIdMax);
        for (int i = 0; i < globalIdMax; ++i) {
            father[i] = i;
        }
        
        for (int i = 0; i < n; ++i) {
            int bookAId = book2Id[ListA[i]];
            int bookBId = book2Id[ListB[i]];
            merge(bookAId, bookBId);
        }
        
        vector<int> sums(globalIdMax, 0);
        int maxId = 0, maxValue = 0;
        for (int i = 0; i < globalIdMax; ++i) {
            int fx = find(i); //not father[i]!
            sums[fx]++;
            if (sums[fx] > maxValue) {
                maxId = fx;
                maxValue = sums[fx];
            }
        }
        
        vector<string> res;
        for (int i = 0; i < globalIdMax; ++i) {
            if (father[i] == maxId) {
                res.push_back(id2Book[i]);
            }
        }
        
        return res;
    }

private:
    vector<int> father;
    map<string, int> book2Id;
    map<int, string> id2Book;
    
    int globalId = 0;
    int find(int x) {
        if (father[x] == x) return x;
        father[x] = find(father[x]);
        return father[x];
    }
    
    void merge(int x, int y) {
        int fx = find(x);   //note it is not father[x]
        int fy = find(y);   //note it is not father[y]
        if (fx != fy) {
            father[fx] = fy; //not father[x] = fy;
        }
    }
};

解法2:BFS
这题应该也可以用BFS。思路跟找最大岛屿差不多,即遍历所有书,每次启动一个BFS,找到一个集合之后把集合里的书设为visited,下次BFS只找没有visited过的书。

代码同步在
https://github.com/luqian2017/Algorithm

BIM Revit教程(六)尝试安装 Revit 时显示“Autodesk Revit 已安装。” 在安装Revit或RevitLT时,若系统提示“AutodeskRevit版本已安装”,通常是由于旧版本残留文件未完全清除所致。解决方案包括:1.通过控制面板或Windows设置卸载旧版本Revit,确保所有相关组件被移除;2.使用Autodesk卸载工具(AdskUninstallHelper)进一步清理;3.谨慎操作注册表,删除与Revit相关的残留项;4.确保系统有至少30GB的可用磁盘空间;5.完成上述步骤后,重新尝试安装Revit。此外,文章还提到了一个免费功能商店,供用户寻找提效工具,并鼓励粉丝 阅读详情

相关推荐

.NET+Vue企业级RBAC权限平台:开箱即用的生产就绪方案

RBAC(基于角色的访问控制)是企业系统安全治理的基础模型,其核心在于将用户、角色与权限解耦,通过动态能力组合实现细粒度管控。在真实工程中,RBAC需突破静态角色限制,支持时间维度授权、前后端双重鉴权、行级数据范围控制等关键能力。本文聚焦于一套已落地金融、政务、制造等多行业的生产级实现——基于.NET Minimal API与Vue 3的前后端分离架构,提供菜单/按钮/接口/数据四层权限控制,内置滑动过期JWT、Redis权限缓存、动态路由加载与权限指令等开箱即用能力,显著降低权限配置与审计成本。

weixin_33326218的博客 275

LeetCode 1971【并查集 DFS BFS】 寻找图中是否存在路径 HERODING的LeetCode之路

这道题是LeetCode中并查集标签下唯一一道简单题,是图论知识中最简单的问题,直接套用模板就可以得到结果,并查集、DFS、BFS都可以很好解决,首先给出DFS的解法。

HERODING23的博客 398

快速理解OSI七层模型(举例理解,数据传输过程,深入理解OSI七层模型)

我们需要了解互联网的本质是一系列的网络协议,这个协议就叫做OSI协议(开放系统互联(Open System Interconnection)),它是由ISO(国际标准化组织)定义的。 需要注意,随着时代的发展,OSI已经被TCP/IP 4层模型淘汰,在当今世界上并没有大规模的使用。 那么对于OSI,人们按照功能不同,分工不同,人为的将OSI的分为七层。实际上这七层是并不存在的,也就是说没有这些概念,而我们今天提到的七层概念,只是人为的划分而已。目的只是为了让大家更好地理解这些都是用来做什么的。

CN_TangZheng的博客 3万+

leetcode重点题目分类别记录(四)图论深入:并查集、二分图、DFS\BFS、拓扑排序、最小生成树、迪杰特拉斯

文章目录入度出度最大网络秩可以到达所有点的最少点数目并查集省份数量等式方程的可满足性按字典序排列最小的等效字符串以图判树二分图判断二分图深度优先搜索封闭岛屿数量太平洋大西洋水流问题广度优先搜索树上逃逸最短路径多源最短路径拓扑排序DFS解决拓扑排序BFS解决拓扑排序 入度出度 最大网络秩 直接相连的道路即为节点的度,如果两个节点是相连的,那么度将会重复计算,因此,统计每个节点的度,和节点相连的情况,每个每一对城市,计算最大网络秩。 int maximalNetworkRank(int n, vect

芸兮的博客 771

深入解析CAN总线BusOff故障的检测与恢复机制

本文深入解析了CAN总线BusOff故障的检测与恢复机制。BusOff是CAN节点因发送错误过多而被强制离线的一种严重状态。文章详细阐述了其触发原理,即发送错误计数器(TEC)超过255,并重点介绍了通过软件实现的快慢恢复机制,以增强网络在异常情况下的稳定性和韧性。

weixin_29158047的博客 525

解决vscode无法运行npm命令的问题(cmd可行)

Powershell以及vscode中npm命令使用不了

无痕坚守本心的博客 2749

奶酪——并查集,BFS,DFS(NOIP2017提高组)

目录题目思路并查集代码(java)BFS(DFS同理)代码(C++) 这个题目意思是有很多个球分布在一个三维空间内,如果这些球相切或者相交都可以互相到达,我们需要判断能否通过这些球从底部到达顶部。可以抽象为,所有的球构成了一个图,球即是图中的点,相切或者相交说明两点之间有线。因此我们可以想到,将所有的点组成一个集合,只需要判断这个集合能否到达底部和顶部。 因此可以使用并查集来组成集合。 最主要的是这个题n只有1000,因此暴力做也没问题。 我们判断每两

weixin_63001635的博客 589

机器学习的学习准则(期望风险最小化、经验风险最小化、结构风险最小化)

要评价模型f(x, θ)的好坏,可通过期望风险R(θ)来衡量:求期望损失R(θ)不仅需要知道损失函数还需要知道真实分布,损失函数可以通过一定的准则计算得到,但是样本空间的真实分布是未知的。所以不能直接求R(θ)。期望风险R(θ)无法计算,给定一个训练集D =,我们可以计算经验风险,经验风险就是在训练集上的平均损失:为了解决过拟合问题,引入了参数正则化来限制模型的能力。使其不要过度的最小化经验风险。这种准则就是结构风险最小化准则

... 2224

DFS和BFS之间的比较

一、深度优先搜索(dfs)的特点是: (1)深度优先搜索法有递归以及非递归两种设计方法。一般的,当搜索深度较小、问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂。当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设计比较好。 (2)深度优先搜索方法有广义和狭义两种理解。广义的理解是,只要最新产生的结点(即深度最大的结点)先进行扩展的方法,就称为深度优先搜索...

To the beyond and infinity! 4789

linux redis7 完整的集群搭建过程

一。安装: 1.1 说明: Redis官方只提供了源码,并没有提供经过编译之后的安装包。 因此,安装Redis,要先编译、后安装。(即源码安装方式) 注意:需要联网安装 1.2 安装编译的工具: yum install gcc gcc-c++ -y 1.3 下载tar包,上传到linux服务器,解压配置环境变量 1.4 cd +解压的目录下:编译 make 注意:如果编译失败,请重新进行解压编译,...

m0_38028438的博客 719

MTK MT6833平台屏幕与TP驱动移植实战:从FAE伪代码到内核模块集成

本文详细介绍了在MTK MT6833平台上进行屏幕与TP驱动移植的完整实战流程。文章从解析供应商提供的初始化伪代码入手,逐步拆解了在LK阶段点亮屏幕、在内核层集成Panel驱动以支持休眠唤醒,以及移植并调试sitronix_ts触摸驱动的核心步骤与关键技巧,为嵌入式开发人员提供了从零到一集成新硬件的清晰指南。

rnn9storyteller的博客 441

EOJ 1816 判断图连通的三种方法——dfs,bfs,并查集

题目:eoj1816   题目分析:判断图是否连通,可用dfs遍历图算法。这里我采用的是并查集的方法。初始化时将每个节点看作一个集合,则每给出一条边即把两个集合合并。最后遍历所有点,有几个集合便有几个连通分量,若只有一个集合说明图连通。   AC代码: #include #include #include #include #include #include

方品 7121

OpenClaw第2章:快速安装

本章将手把手教你安装 OpenClaw。

Maynor的博客 3236

判断无向图是否有环路的方法 -并查集 -BFS

可以利用并查集或者带颜色标记的BFS(来自算法导论)判断。 首先介绍第一种,用并查集来判断: 首先初始化所有元素的根为-1,-1代表根节点,接下来对于图中的每一条边(v1,v2)都并入集合,并入的方式为查找v1和v2的根节点,然后让v2的根节点作为v1的根节点,查找根节点的过程为:如果当前的结点根为-1,说明这个结点就是根,直接返回,否则再继续查找结点父亲的根,直到找到祖先结点,这里因...

weixin_30457551的博客 1349

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

DFS和BFS和并查集的 存档

上:(x-1,y) 下:(x+1,y) 左:(x,y-1) 右:(x,y+1) 构造2个方向数组dx[]={-1,1,0,0},dy[]={0,0,-1,1}; for(int i=0;i {      int nx=x+dx[i];      int ny=y+dy[i]; } void dfs(...........)       //参数就是当前点坐标 {  

呜啦啦 389

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

最大关联集合-LintCode

亚麻卖书,每本书都有与其关联性很强的书,给出ListA与ListB,表示ListA[i]与ListB[i]有关联,输出互相关联的最大集合。(输出任意顺序),题目保证只有一个最大的集合。 注意事项 书籍的数量不会超过5000。 样例 给出ListA = [“abc”,”abc”,”abc”], ListB = [“bcd”,”acd”,”def”], 返回 [“abc”,”acd”,”b...

kane的博客 745

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【并查集,Bfs】汽车拉力比赛

链接 https://www.luogu.org/problemnew/show/P2658 题目大意 在一个n×mn×mn\times m的矩阵中,每个点都有相应的高度,规定两点间的高度差不大于DDD就当这两个点联通,先要求出最小的DDD使得给定的点都联通 解题思路 显然,假如D=50D=50D=50,满足要求的话,那么D=51D=51D=51也必定满足要求,说玄学一点就是答案...

Ajwallet 437

HDU 4514 湫湫系列故事——设计风景线

湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 289    Accepted Submission(s): 77 Problem Description   随着杭州西湖的知名度的进一步提升,

hqu_fritz的专栏 2266

算法-并查集/DFS/BFS-朋友圈

算法-并查集/DFS/BFS-朋友圈 1 题目概述 1.1 题目出处 https://leetcode-cn.com/problems/friend-circles/ 1.2 题目描述 班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。 给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互

迷路剑客个人博客 876

Maximum Association Set

Amazon sells books, every book has books which are strongly associated with it. Given ListA and ListB,indicates thatListA [i]is associated withListB [i]which represents the book and associated boo...

leetcode 解题思路 234

连通图的判断(并查集, DFS, BFS)

 首先要明确什么是连通图??? 连通图:对于一个图来说,图中的任意一个点都能访问到所有的点,则说明该图连通   很明显,如果要判断一个图是否连通,则必须要从任意一个搜索一遍,判断是否到达了所有的点,则很快会想到DFS和BFS。但是用并查集去判断是否连通,这种思想去确实没有想到。 如果用并查集来判断确实可以加快速度。让自己对并查集又有了新的认识。同时并查集还可以判断一个图是否形成自回路。...

qq_41818544的博客 3161

判断图的连通性方法(DFS,BFS,并查集)

判断图是否连通,可用dfs和bfs遍历图算法,注意点数目较多,又是稀疏图的话,最后使用邻接表的方法存储。另外推荐采用的是并查集的方法。初始化时将每个节点看作一个集合,则每给出一条边即把两个集合合并。最后遍历所有点,有几个集合便有几个连通分量,若只有一个集合说明图连通。并查集方法通常情况下时间效率较高,还能判断一个图是否有回路,在kruskal算法中也可以使用。 (1)DFS判断 int...

m0_37701448的博客 1万+

二分图判定(DFS/BFS/并查集)

一、二分图定义 二分图,是图论中的一种特殊模型,设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且同一集合中不同的两点没有边相连。看一个例子: 图中点集合分为A(包含2,4号顶点)和B(包含1,3,5,6号顶点),并且A,B集合中的点没有形成连接关系,显然这这是一个二分图。 二、二分图判定 定理1:无向图G为二分图的一个充要条件是: 1、G中至少包含两个顶点 2、...

时光、疏离了记忆づ童话的博客 8494

【Lintcode】805. Maximum Association Set

题目地址: https://www.lintcode.com/problem/maximum-association-set/description 给定一个图的若干条边,边以出发点数组和到达点数组构成。要求返回最大连通块里包含的顶点组成的列表。 思路是并查集,代码如下: import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Soluti

数学、算法爱好者的博客 243

判断图的连通性的三种方法:DFS、BFS 和并查集

1 什么是结点的连通性? 若图 G 中两个不同的结点 u 和 v 存在路径 e,则称结点 u 和结点 v 连通。 2 什么是图的连通性? 若图 G 中任意两个结点连通,则称图 G 连通。 3 怎样判断图的连通性? 判断图的连通性的常见方法有三种:DFS、BFS 和并查集。 3.1 DFS 深度优先遍历得到的是图的一个连通分量。 算法流程: 从某个结点 v 出发,访问结点 v,并令 vis[v] = 1; 查找 v 的所有邻接点 i,若结点 i 并未被访问过(vis[i] = 0),则从结点 i

CC 5149

[并查集][bfs]JZOJ P3973 黑白数

Description 给定一棵树,边的颜色为黑或白,初始时全部为白色。维护两个操作:1. 查询 u 到根路径上的第一条黑色边的标号。2. 将 u 到 v 路径上的所有边的颜色设为黑色。 Input 第一行两个数 n, m 分别表示点数和操作数。接下来 n − 1 行,每行 2 个数 u, v 表示一条 u 到 v 的边。接下来 m 行,每行为以下格式:• 1 v ...

weixin_30911809的博客 236
上一篇: LintCode 630: Knight Shortest Path II (BFS和DP经典题)
下一篇: LintCode 735: Replace With Greatest From Right
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值