非递归并查集——zoj4109】的更多相关文章

卡常卡的我难受 非递归并查集好像写起来常数小一点 int F[maxn]; int Find(int x){ int r = x; while (F[r] != r)r = F[r]; int i = x,j; while (F[i] != r){ j = F[i]; F[i] = r; i = j; } return r; } void Union(int u,int v){ int f1=Find(u),f2=Find(v); if(f1!=f2){ if(f1>f2)swap(f1,f2)…
题意: 输入一个正整数N(<=1000),表示人数,接着输入N行每行包括一个他的爱好数量:和爱好的序号.拥有相同爱好的人们可以默认他们在同一个俱乐部,输出俱乐部的数量并从大到小输出俱乐部的人数(不同俱乐部的两个人的爱好一定不相同). AAAAAccepted code: #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; vector<],st; ]; ]; int find_(int…
容易发现x nand x=not x.并且使用这个性质有x and y=not(x nand y)=(x nand y)nand(x nand y).也就是说nand运算可以作为not和and运算使用.并且显然not和and运算可以表示nand运算,那么两者等价.事实上这就可以表示所有位运算了. 那么考虑位运算有什么事干不了.注意到如果每个数的第i位都和第j位相同, 那么无论怎么操作这两位都是相同的.大胆猜想这也是充分的,即除了这件事其他都能干. 这样位就被分成了很多类,每一类的取值要求相同.类…
#include<bits/stdc++.h>using namespace std;long long w[100007],sum[100007];int fa[100007],degree[100007],dp[100007],depth[100007];int flag[100007];int vis[100007]; int find_x(int x)//非递归并查集{    int k, j, r;    r = x;    while(r != dp[r])     //查找根节点…
F. Asya And Kittens time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Asya loves animals very much. Recently, she purchased nn kittens, enumerated them from 11 and nn and then put them into…
有向图的合并,典型问题:通知小弟(信息只能单向传播)https://www.nowcoder.com/acm/contest/76/E 无向图的合并,典型问题:修道路问题 由于无向图只要二者有联系即可(即不需要分清是谁触发谁,也就无所谓父亲节点与儿子节点.孙子节点...),所以只需要建立一个并查集就能很容易地进行合并 而有向图由于只能是A触发B,不能是B触发A,所以不能通过建立并查集解决,此时只能通过递归找其各个儿子节点.孙子节点.....…
[BZOJ2728][HNOI2012]与非 Description Input 输入文件第一行是用空格隔开的四个正整数N,K,L和R,接下来的一行是N个非负整数A1,A2……AN,其含义如上所述. 100%的数据满足K≤60且N≤1000,0<=Ai<=2^k-1,0<=L<=R<=10^18 Output 仅包含一个整数,表示[L,R]内可以被计算出的数的个数 Sample Input 3 3 1 4 3 4 5 Sample Output 4 HINT 样例1中,(3…
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 B(G).其中 T(G)是遍历图时所经过的边的集合,B(G) 是遍历图时未经过的边的集合.显然,G1(V, T) 是图 G 的极小连通子图,即子图G1 是连通图 G 的生成树. 深度优先生成森林   右边的是深度优先生成森林: 连通图的生成树不一定是唯一的,不同的遍历图的方法得到不同的生成树;从不…
并查集合并 #include<iostream> using namespace std; const int MAX = 10010; int father[MAX],root[MAX]; int findfather(int x){ if(x==father[x]) return x; else{ int F=findfather(father[x]); father[x]=F; return F; } } void Union(int a , int b){ int faA=findfa…
POINT: 把每个元素看成顶点,则一个简单化合物就是一条无向边,若存在环(即k对组合中有k种元素),则危险,不应该装箱,反之,装箱: 用一个并查集维护连通分量集合,每次得到一种化合物(x, y)时检查x, y是否在同一集合中,如果是,拒绝,反之接受. 并查集 并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示. 集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并. -----------…