非递归并查集——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);
F[f2]=f1;
}
}
下面是完整代码
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000005
vector<int> G[maxn];
int n,m; 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);
F[f2]=f1;
}
} int vis[maxn],ans[maxn],tt;
priority_queue<int,vector<int>, greater<int> >pq; void init(){
tt=;
for(int i=;i<=n;i++)G[i].clear(),F[i]=i,vis[i]=;
while(pq.size())pq.pop();
}
void addedge(int u,int v){G[u].push_back(v);}
int main(){
int t;
cin>>t;while(t--){
scanf("%d%d",&n,&m);
init();
for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v);addedge(v,u);
Union(u,v);
} for(int i=;i<=n;i++)
if(Find(i)==i)pq.push(i);
cout<<pq.size()<<endl; while(!pq.empty()){
int cur=pq.top();pq.pop();
if(vis[cur])continue;
vis[cur]=;
ans[++tt]=cur;
for(int i=;i<G[cur].size();i++){
int v=G[cur][i];
if(vis[v])continue;
pq.push(v);
}
}
for(int i=;i<tt;i++)cout<<ans[i]<<" ";
cout<<ans[tt]<<endl;
}
}
非递归并查集——zoj4109的更多相关文章
- 【PAT甲级】1107 Social Clusters (30分)(非递归并查集)
题意: 输入一个正整数N(<=1000),表示人数,接着输入N行每行包括一个他的爱好数量:和爱好的序号.拥有相同爱好的人们可以默认他们在同一个俱乐部,输出俱乐部的数量并从大到小输出俱乐部的人数( ...
- BZOJ2728 HNOI2012与非(并查集+数位dp)
容易发现x nand x=not x.并且使用这个性质有x and y=not(x nand y)=(x nand y)nand(x nand y).也就是说nand运算可以作为not和and运算使用 ...
- Codeforces#514E(贪心,并查集)
#include<bits/stdc++.h>using namespace std;long long w[100007],sum[100007];int fa[100007],degr ...
- Codeforces 1131 F. Asya And Kittens-双向链表(模拟或者STL list)+并查集(或者STL list的splice()函数)-对不起,我太菜了。。。 (Codeforces Round #541 (Div. 2))
F. Asya And Kittens time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 有向图与无向图的合并操作区别D(递归与并查集)
有向图的合并,典型问题:通知小弟(信息只能单向传播)https://www.nowcoder.com/acm/contest/76/E 无向图的合并,典型问题:修道路问题 由于无向图只要二者有联系即可 ...
- 【BZOJ2728】[HNOI2012]与非 并查集+数位DP
[BZOJ2728][HNOI2012]与非 Description Input 输入文件第一行是用空格隔开的四个正整数N,K,L和R,接下来的一行是N个非负整数A1,A2……AN,其含义如上所述. ...
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...
- PAT A 1118. Birds in Forest (25)【并查集】
并查集合并 #include<iostream> using namespace std; const int MAX = 10010; int father[MAX],root[MAX] ...
- 并查集(UVA 1106)
POINT: 把每个元素看成顶点,则一个简单化合物就是一条无向边,若存在环(即k对组合中有k种元素),则危险,不应该装箱,反之,装箱: 用一个并查集维护连通分量集合,每次得到一种化合物(x, y)时检 ...
随机推荐
- BlockQueue 解析
生产者.消费者模式 https://www.jianshu.com/p/024a36b83099
- 数据库MySQL——初识
认识数据库—MySQL 楔子 假设现在你已经是某大型互联网公司的高级程序员,让你写一个火车票购票系统,来hold住十一期间全国的购票需求,你怎么写? 由于在同一时段抢票的人数太多,所以你的程序不可能写 ...
- 洛谷P4630 铁人两项--圆方树
一道很好的圆方树入门题 感谢PinkRabbit巨佬的博客,讲的太好啦 首先是构建圆方树的代码,也比较好想好记 void tarjan(int u) { dfn[u] = low[u] = ++dfn ...
- postgreSQL可视化工具pgAdmin3 导入表结构和数据
材料:.backup文件.postgreSQL(pgAdmin3) 1.新建一个数据库2.选中数据库右键还原,弹出框中选择本地计算机备份文件路径---->点击还原(选择一个修改时间最早和最晚的还 ...
- 什么是MIPI
随着客户要求手机摄像头像素越来越高同时要求高的传输速度传统的并口传输越来越受到挑战.提高并口传输的输出时钟是一个办法但会导致系统的EMC设计变得越来困难,增加传输线的位数是但是这又不符合小型化 ...
- python3.x执行post请求时报错“POST data should be bytes or an iterable of bytes...”的解决方法
使用python3.5.1执行post请求时,一直报错"POST data should be bytes or an iterable of bytes. It cannot be of ...
- Tomcat系列(8)——Tomcat运行模式连接数和线程池
Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据:然后分配线程让Engine(也就是Servlet容器)来处理这个请求,并把产生的Reques ...
- ES6.3.2 index操作源码流程
ES 6.3.2 index 操作源码流程 client 发送请求 TransportBulkAction#doExecute(Task,BulkRequest,listener) 解析请求,是否要自 ...
- 13、Ajax的使用
一.AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. a).AJAX = 异步 JavaScript 和 XML. b).AJAX 是一种用于创建快速动态网页的技术. 通过在后 ...
- Java(13) 抽象和封装
一.简述从现实世界中抽象出类的步骤 第一:找出分类(分析出类) 第二:找出类的特征(分析类的相关属性) 第三:找出类的行为(分析类的方法) 二.常量(经常出现的变量值) 2.1 语法: public ...