http://abc049.contest.atcoder.jp/tasks/arc065_b

一开始做这题的时候,就直接蒙逼了,n是2e5,如果真的要算出每一个节点u能否到达任意一个节点i,这不是floyd吗?复杂度要达到n^3,bitset优化也没用了。然后想了想,肯定不是的,如果有很快的方法能判断出一张图的两个节点是否连通,那floyd就没用了。然后想了一节课,发现还是需要判断是否相连啊,不判断就没得玩了。

然后想到了并查集,确实可以很快判断是否相连了。然后我就想那floyd就没啥用了吧。然后看回以前的笔记,原来floyd可以解决单向的,而并查集就不行了。(最短路径都是可以解决单向的)

还是知识点不够扎实,不知道各种算法之间的差别,所以想题容易想歪。看见单向的,就不能想去并查集那里了。

然后就是每个节点都在一个集合里面了,集合中任意两个元素都能相连,同样用第二个并查集维护第二种边。然后枚举节点i,算出这个节点在两个并查集中的集合,他们的交集就是贡献。

然后就TLE了。

转化一下思路,对于每个点,它的爸爸是固定的,那么,把这个点的贡献加进去它爸爸那里。这样每个点就算一次就够了,

al[father1, father2]表示这两个爸爸代表的集合的交集是多少。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <bitset>
const int maxn = 2e5 + ;
int fa[][maxn];
int getFa(int u, int which) {
if (fa[which][u] == u) return u;
else return fa[which][u] = getFa(fa[which][u], which);
}
void toMerge(int x, int y, int which) {
x = getFa(x, which);
y = getFa(y, which);
fa[which][y] = x;
}
map<pair<int, int>, int>al;
void work() {
int n, k1, k2;
scanf("%d%d%d", &n, &k1, &k2);
for (int i = ; i <= n; ++i) {
fa[][i] = fa[][i] = i;
}
for (int i = ; i <= k1; ++i) {
int u, v;
scanf("%d%d", &u, &v);
toMerge(u, v, );
}
for (int i = ; i <= k2; ++i) {
int u, v;
scanf("%d%d", &u, &v);
toMerge(u, v, );
}
for (int i = ; i <= n; ++i) {
al[make_pair(getFa(i, ), getFa(i, ))]++;
}
for (int i = ; i <= n; ++i) {
cout << al[make_pair(getFa(i, ), getFa(i, ))] << " ";
}
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}

感觉最后一步的转化很重要,不知道这步就TLE。我该怎么锻炼这方面的思维。

要想到为什么可以转换,关键是知道,

我对于每一个点,我只关心这个点所在的集合和那个点所在的集合的交集。

那么交集的话,找爸爸出来做代表,算出爸爸1和爸爸2的交集,细分一下就是每个点的贡献和。

D - 連結 / Connectivity 并查集的更多相关文章

  1. Atcoder 2159 連結 / Connectivity(并查集+map乱搞)

    問題文N 個の都市があり.K 本の道路と L 本の鉄道が都市の間に伸びています. i 番目の道路は pi 番目と qi 番目の都市を双方向に結び. i 番目の鉄道は ri 番目と si 番目の都市を双 ...

  2. AtCoder Beginner Contest 049 & ARC065 連結 / Connectivity AtCoder - 2159 (并查集)

    Problem Statement There are N cities. There are also K roads and L railways, extending between the c ...

  3. 【并查集】【set】AtCoder - 2159 - 連結 / Connectivity

    Problem Statement There are N cities. There are also K roads and L railways, extending between the c ...

  4. 【并查集】Connectivity @ABC049&amp;ARC065/upcexam6492

    Connectivity 时间限制: 1 Sec  内存限制: 128 MB 题目描述 There are N cities. There are also K roads and L railway ...

  5. Union-Find 并查集算法

    一.动态连通性(Dynamic Connectivity) Union-Find 算法(中文称并查集算法)是解决动态连通性(Dynamic Conectivity)问题的一种算法.动态连通性是计算机图 ...

  6. [leetcode] 并查集(Ⅰ)

    预备知识 并查集 (Union Set) 一种常见的应用是计算一个图中连通分量的个数.比如: a e / \ | b c f | | d g 上图的连通分量的个数为 2 . 并查集的主要思想是在每个连 ...

  7. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  8. 关押罪犯 and 食物链(并查集)

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...

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

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

随机推荐

  1. 基于BASYS2的VHDL程序与仿真——50%占空比8分频器

    转帖请注明转自http://www.cnblogs.com/connorzx/p/3547673.html 一.新建工程 1.点击File->New Project, 2.点击Next 注:此处 ...

  2. 为 Android 平台开发一个输入法

    学习目标: 实现新的输入法 学习目的: 掌握Android输入法框架 学习收获: Android 1.5 新特色之一就是输入法框架(Input Method Framework,IMF),正是它的出现 ...

  3. svg矢量图制作工具(Sketsa SVG Editor) v7.1.1 中文免费版

    下载地址:https://www.jb51.net/softs/555253.html Sketsa SVG Editor中文版是一款强大好用的矢量图绘制工具,该工具的最大特色就是集成了中文语言,且支 ...

  4. ansible管理windows实践

    一.前言 近期打算搞搞自动部署,因为是windows服务器,一些工具和系统支持都不是太好.最后发现ansible比较火,最重要的是他支持windows.本文主要就ansible 在windows使用环 ...

  5. python 函数定义

    我们可以创建一个函数来列出费氏数列 >>> def fib(n): # write Fibonacci series up to n ... """Pr ...

  6. centos 安装配置kettle

    安装JDK1.8: step1 下载JDK1.8 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...

  7. Numpy 小结

    Python 真火来学习一下,先来看一个库 NumPy.NumPy是Python语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. 1. 读取文件 num ...

  8. bzoj5117

    线段树 先看前三个操作,都是区间修改,我们对于信息维护一个二元组(a,b),表示x=max(x+a,b),那么第一个操作就是(a,-inf),第二个是(-a,0),第三个是(-inf,a) 然后看查询 ...

  9. sql语句之连表操作

    内连接 select * from employee inner join department on employee.dep_id = department.id 左连接 在内连接的基础上保留左表 ...

  10. 一步步完成“迷你版” 的ASP.NET Core框架

    一 前言 Artech 分享了 200行代码,7个对象--让你了解ASP.NET Core框架的本质 . 用一个极简的模拟框架阐述了ASP.NET Core框架最为核心的部分. 这里一步步来完成这个迷 ...