卡常卡的我难受

非递归并查集好像写起来常数小一点

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的更多相关文章

  1. 【PAT甲级】1107 Social Clusters (30分)(非递归并查集)

    题意: 输入一个正整数N(<=1000),表示人数,接着输入N行每行包括一个他的爱好数量:和爱好的序号.拥有相同爱好的人们可以默认他们在同一个俱乐部,输出俱乐部的数量并从大到小输出俱乐部的人数( ...

  2. 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运算使用 ...

  3. Codeforces#514E(贪心,并查集)

    #include<bits/stdc++.h>using namespace std;long long w[100007],sum[100007];int fa[100007],degr ...

  4. 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 ...

  5. 有向图与无向图的合并操作区别D(递归与并查集)

    有向图的合并,典型问题:通知小弟(信息只能单向传播)https://www.nowcoder.com/acm/contest/76/E 无向图的合并,典型问题:修道路问题 由于无向图只要二者有联系即可 ...

  6. 【BZOJ2728】[HNOI2012]与非 并查集+数位DP

    [BZOJ2728][HNOI2012]与非 Description Input 输入文件第一行是用空格隔开的四个正整数N,K,L和R,接下来的一行是N个非负整数A1,A2……AN,其含义如上所述.  ...

  7. 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

    图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...

  8. PAT A 1118. Birds in Forest (25)【并查集】

    并查集合并 #include<iostream> using namespace std; const int MAX = 10010; int father[MAX],root[MAX] ...

  9. 并查集(UVA 1106)

    POINT: 把每个元素看成顶点,则一个简单化合物就是一条无向边,若存在环(即k对组合中有k种元素),则危险,不应该装箱,反之,装箱: 用一个并查集维护连通分量集合,每次得到一种化合物(x, y)时检 ...

随机推荐

  1. opencontrail—VXLAN模式下数据包的传输过程

    在这篇文章中,我们将看到VM生成的数据包如何能够到达另一个VM或外部资源,Neutron使用OpenContrail插件的上下文中的关键概念/组件是什么. 我们将重点介绍OpenContrail,它如 ...

  2. CF 441E Valera and Number

    CF 441E Description 一共执行\(k\)次,每次有\(p\%\)把\(x * 2\),有\((100 - p)\%\)把\(x + 1\).问二进制下\(x\)末尾期望\(0\)的个 ...

  3. ubuntu16.04安装中文输入法

    https://blog.csdn.net/u011795345/article/details/53041707

  4. MFC:关联变量

    1. 对象(控制)变量(control) a. 数据类型:control 只能创建关联一次 b).    control 用来操控控件 c). 创建 control 变量:控件 -> 右击 -& ...

  5. spring的DI.IoC是什么

    最近要搞spring的单元测试,不得已啊啊啊啊啊啊啊啊啊又要开始搞spring…… 日目晶…… 搞这几个概念,先甩一部分代码: UserDao 接口 package com.itheima.ioc; ...

  6. Tomcat系列(8)——Tomcat运行模式连接数和线程池

    Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据:然后分配线程让Engine(也就是Servlet容器)来处理这个请求,并把产生的Reques ...

  7. GIT-windows系统部署gitblit服务器

    windows系统部署 gitblit 服务器 1. 安装JAVA环境 下载Java,下载地址:http://www.java.com/zh_CN/ 安装Java.安装步骤不再详述.      配置J ...

  8. HTTP协议6之状态码--转

    HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果是做AJAX,REST,网络爬虫, ...

  9. PMP知识点(五)——配置管理

    配置控制重点关注可交付成果及各个过程的技术规范,而变更控制则着眼于识别.记录.批准或否决对项目文件,可交付成果或基准的变更. 包括在实施整体变更控制过程中的部分配置管理活动有: 1.配置识别. 识别与 ...

  10. 【SQL学习笔记】一、select语句

    SQL有别于其他的编程语言的一点在于首先处理的并不是写在第一行的语句(select),而是from字句. 为了更详细的了解select语句的每个部分,举例如下: 该语句返回的结果是下订单超过4次的女顾 ...