并查集
ITCharge
高效率编程,慢节奏生活。
展开
-
POJ1611_The Suspects
n个学生分属m个团体,(0 < n <= 30000 , 0 一个学生疑似患病,则它所属的整个团体都 疑似患病。已知0号学生疑似患病,以及每个 团体都由哪些学生构成,求一共多少个学生 疑似患病。原创 2014-08-08 20:33:08 · 744 阅读 · 0 评论 -
POJ1988_Cube Stacking
Cube Stacking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 18973 Accepted: 6605 Case Time Limit: 1000MS Description Farmer John and Betsy are playing原创 2014-08-08 20:46:18 · 889 阅读 · 0 评论 -
HDU1863_畅通工程【Prim】【并查集】
题目大意:给你M个村庄、N条路,即N条路所连接的两个村庄即路程。 问能否各个村庄都能有路达到,若不通,则输出'?',若通,则计算出连接 所有村庄最小的路程和 思路:先用并查集判断能否所有村庄。把有路连接的村庄并到一个集合里。 最后,若只有一个集合,则所有村庄都能连接。若有两个以上,则肯定有 村庄不能到达。然后用Prim算法计算出图的最小生成树。原创 2014-10-19 21:17:14 · 1158 阅读 · 0 评论 -
POJ1330 Nearest Common Ancestors【最近公共祖先】【Tarjan-LCA算法】
题目大意:给你一棵树,有N个结点,N-1条边。最后询问距离树上两个点(u,v)最近的 公共祖先是多少。 比如上图:6和16的最近公共祖先就是4;14和1的最近公共祖先就是1。 思路:对于最近公共祖先LCA问题,最经典的离线算法是Tarjan-LCA算法。用链式前向 星存储图和询问,Head[]和Edges[]表示图(树),QHead[]和QEdges[]表示询问。集合 的操作用并查集实现。这道题里用了indegree[]数组来存储结点的入度,找到入度为0的 根结点root,调用LCA(root)。 Tarj原创 2014-12-31 20:42:20 · 931 阅读 · 0 评论 -
POJ1986 Distance Queries【最近公共祖先】【Tarjan-LCA算法】
题目大意:John是一个农场主,他的牛很懒,拒绝按照John选的路走。John不得不找一条 最短的路。这道题的输入前半部分和POJ1984"Navigation Nightmare"相同。在每组数据 之后是一个整数K,接下来K行是询问(u,v)的曼哈顿距离(u,v是农场编号)。最后输出所有 询问结果。 POJ1984链接:http://poj.org/problem?id=1984 思路:本题输入有些特殊,给出的是某点在某点的某个方向(东西南北)有多远。由于输入数 据比较特殊。全部是有向边,且构不成回路,所原创 2014-12-31 21:02:06 · 3882 阅读 · 0 评论 -
HDU2586 How far away ?【最近公共祖先】【Tarjan-LCA算法】
题目大意:一个村庄有N个房子和一些双向的路,人们总是喜欢问"A到B有多远呢",一般是很难 回答的,毕竟有很多种答案。所幸,答案是唯一的,A到B总是有唯一的路径到达。第一行是T组 数据。每组数据第一行是N个房子和M条询问。接下来N-1行每行是u v w,表示从房子u到房子v 的距离是w。接下来是M行询问。每行是u v,表示询问房子u到房子v的距离,最后输出所有的询 问结果。 思路:整个村庄房子和路可看成一棵树,设根结点为房子1,询问u到房子v的距离,其实就是求u 到根结点的距离 + v到根结点的距离 - 2*原创 2014-12-31 21:53:16 · 1273 阅读 · 0 评论 -
HDU1213 How Many Tables【并查集】
题目大意: N个朋友聚会,只有认识的人才会坐在一桌。给你M个朋友关系(A,B),表示A认识B。且认识 关系具有传递性。即如果A认识B,B认识C,那么A也认识C。所以A、B、C可以坐在一桌上。 那么问题来了:问:如果让认识的人坐一桌,那么最少要安排多少张桌子才能满足要求。 思路 : 直接能想到用并查集来做。对于所给认识关系(A、B),查找二人的父节点是否相同,不相同则并 为一个集合,相同说明之前已经认识了(不做出来)。最后统计集合的个数就行了。原创 2015-02-07 22:49:57 · 979 阅读 · 0 评论 -
HDU4496 D-City【并查集】
题目大意: 给出一张图,按照给定的边的顺序逐个删除。问每删除一条边后图的连通块数是多少。 思路: 逆向并查集求联通块数。假设一开始的时候所有点都不连通。从给定边逆着的顺序,即从最后 一条边开始添加。如果新添加的边连通了两个连通分量,则连通块数就减一,否则不改变。将 每次加边后的连通块数存起来。最后输出出来。原创 2015-04-25 21:26:16 · 970 阅读 · 0 评论