并查集
ITCharge
高效率编程,慢节奏生活。
展开
-
POJ1611_The Suspects
n个学生分属m个团体,(0 < n <= 30000 , 0一个学生疑似患病,则它所属的整个团体都疑似患病。已知0号学生疑似患病,以及每个团体都由哪些学生构成,求一共多少个学生疑似患病。原创 2014-08-08 20:33:08 · 736 阅读 · 0 评论 -
POJ1988_Cube Stacking
Cube StackingTime Limit: 2000MS Memory Limit: 30000KTotal Submissions: 18973 Accepted: 6605Case Time Limit: 1000MSDescriptionFarmer John and Betsy are playing原创 2014-08-08 20:46:18 · 878 阅读 · 0 评论 -
HDU1863_畅通工程【Prim】【并查集】
题目大意:给你M个村庄、N条路,即N条路所连接的两个村庄即路程。问能否各个村庄都能有路达到,若不通,则输出'?',若通,则计算出连接所有村庄最小的路程和思路:先用并查集判断能否所有村庄。把有路连接的村庄并到一个集合里。最后,若只有一个集合,则所有村庄都能连接。若有两个以上,则肯定有村庄不能到达。然后用Prim算法计算出图的最小生成树。原创 2014-10-19 21:17:14 · 1150 阅读 · 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 · 923 阅读 · 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 · 3869 阅读 · 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 · 1263 阅读 · 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 · 977 阅读 · 0 评论 -
HDU4496 D-City【并查集】
题目大意:给出一张图,按照给定的边的顺序逐个删除。问每删除一条边后图的连通块数是多少。思路:逆向并查集求联通块数。假设一开始的时候所有点都不连通。从给定边逆着的顺序,即从最后一条边开始添加。如果新添加的边连通了两个连通分量,则连通块数就减一,否则不改变。将每次加边后的连通块数存起来。最后输出出来。原创 2015-04-25 21:26:16 · 962 阅读 · 0 评论