题目链接

题意简述

仰慕喜欢同色奶牛的奶牛喜欢同色 (禁止套娃 ,求一种方案,奶牛喜欢的颜色种数最多,多种方案求字典序最小。

题目解析

这道题我最先想到的居然是二分+并查集,我在想啥

咳咳

首先,考虑一个比较简单的情况,假如图长这样:

仰慕关系:\(6,4\)仰慕\(5\),\(3,1\)仰慕\(2\)

同一头奶牛喜欢的颜色当然是相同的,\(6,4\)仰慕对象的喜好颜色一样,所以\(6,4\)喜欢的颜色一样,同理\(3,1\)喜欢的颜色一样。我们把他们用并查集套起来,数有几个块就可以了

然后考虑更复杂的情况:

如图,\(4\)是一只花心的奶牛,它不仅仰慕\(5\),还仰慕\(2\)。

同一头奶牛喜欢的颜色当然是相同的,\(4\)只有一种喜欢的颜色,而\(6\)和\(4\)喜欢颜色一样,因为它们都喜欢\(5\),同理,\(3,1\)喜好颜色也和\(4\)一样,那么两个连通块就通过\(4\)联通了。

为了方便写代码,我们这样看这个图:(就是把边反了个向,好写代码

从两只站在仰慕链顶端的牛出发(其实也不一定是从它们出发,反正所有牛的儿子都要并在一起,话说也不一定有站在仰慕链顶端的牛,没有保证是\(DAG\)),把它们的儿子并在一起,如果碰到了\(4\)这样的花心结点,就把两个并查集合在一起。

至于原图,一个并查集里的点可以当成一个点来处理,也就是要缩点。具体的方法很暴力,就是把别人的儿子接到我这里来,然后把别人和它的儿子都从图里删掉。为了保障复杂度,用启发式合并,也就是小的集合合并到大集合上去。


►Code View

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
#define LL long long
#define N 200005
#define INF 0x3f3f3f3f
int rd()
{
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48); c=getchar();}
return f*x;
}
vector<int>G[N];
int n,m,f[N]/*连通块的大小 启发式合并要用到 初始为-1 表示自己是根*/,c[N];
int Find(int x)
{
if(f[x]<0) return x;
return f[x]=Find(f[x]);
}
void dfs(int u)
{
if(G[u].size()<2) return ;
int x=Find(G[u][0]);
for(int i=1;i<G[u].size();i++)
{
int y=Find(G[u][i]);
if(x==y)continue;
if(f[x]<=f[y])
{
f[x]+=f[y];
f[y]=x;
for(int j=0;j<G[y].size();j++)
G[x].push_back(G[y][j]);
G[y].clear();
}
else
{
f[y]+=f[x];
f[x]=y;
for(int j=0;j<G[x].size();j++)
G[y].push_back(G[x][j]);
G[x].clear();
x=y;
}
}
G[u].clear();
G[u].push_back(x);
dfs(x);
}
int main()
{
memset(f,-1,sizeof(f));
n=rd(),m=rd();
for(int i=1;i<=m;i++)
{
int u=rd(),v=rd();
G[u].push_back(v);
}
for(int i=1;i<=n;i++)
dfs(i);
int cnt=0;
for(int i=1;i<=n;i++)
{
int fa=Find(i);
if(!c[fa]) c[fa]=++cnt;
printf("%d\n",c[fa]);
}
return 0;
}

USACO 2020 OPEN Favorite Colors【并查集-启发式合并-思考】的更多相关文章

  1. BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并

    题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...

  2. BZOJ 4668: 冷战 并查集启发式合并/LCT

    挺好想的,最简单的方法是并查集启发式合并,加暴力跳父亲. 然而,这个代码量比较小,比较好写,所以我写了 LCT,更具挑战性. #include <cstdio> #include < ...

  3. [HDU 3712] Fiolki (带边权并查集+启发式合并)

    [HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[ ...

  4. [BZOJ 4668]冷战(带边权并查集+启发式合并)

    [BZOJ 4668]冷战(并查集+启发式合并) 题面 一开始有n个点,动态加边,同时查询u,v最早什么时候联通.强制在线 分析 用并查集维护连通性,每个点x还要另外记录tim[x],表示x什么时间与 ...

  5. BZOJ 3673: 可持久化并查集(可持久化并查集+启发式合并)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3673 题意: 思路: 可持久化数组可以用可持久化线段树来实现,并查集的查询操作和原来的一般并查集操作 ...

  6. Codeforces 1166F 并查集 启发式合并

    题意:给你一张无向图,无向图中每条边有颜色.有两种操作,一种是询问从x到y是否有双彩虹路,一种是在x到y之间添加一条颜色为z的边.双彩虹路是指:如果给这条路径的点编号,那么第i个点和第i - 1个点相 ...

  7. [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  8. 【AGC014E】Blue and Red Tree 并查集 启发式合并

    题目描述 有一棵\(n\)个点的树,最开始所有边都是蓝边.每次你可以选择一条全是蓝边的路径,删掉其中一条,再把这两个端点之间连一条红边.再给你一棵树,这棵树的所有边都是红边,问你最终能不能把原来的树变 ...

  9. 2018.08.21 bzoj4668: 冷战(并查集+启发式合并)

    传送门 可以发现需要维护连通性和两点连通时间. 前者显然是并查集的常规操作,关键就在于如何维护两点的连通时间. 然后会想到这个时候不能用路径压缩了,因为它会破坏原本树形集合的结构,因此可以启发式按si ...

随机推荐

  1. jmeter_03_鉴权

    jmeter权鉴* 1.配置节点 - 2.前置处理器 3.定时器 4.取样器 5.后置处理器(只在有结果的情况下执行) 6.断言(只在有结果的情况下执行) 7.监听器(只在有结果的情况下执行) 参数叠 ...

  2. Codeforces Round #677 (Div. 3) D/1433D Districts Connection

    https://codeforces.com/contest/1433/problem/D 找两个不同权值的节点A.B连起来,所有与A不同权值的连到A上,相同的连到B上. #include<io ...

  3. 基于ECS搭建云上博客

    场景介绍 本文为您介绍如何基于ECS搭建云上博客. 背景知识 本场景主要涉及以下云产品和服务: 云服务器ECS 云服务器(Elastic Compute Service,简称ECS)是阿里云提供的性能 ...

  4. JMeter实战(二) 运行原理

    运行原理 如果不用工具,要做 100 并发的压力测试,得想办法组织 100 个人,每个人操作1台电脑,一声令下,100 个人同时点击,对系统造成 100 并发.现实中,很难找 100 个人和 100 ...

  5. AngularJS——ui-router

    深究AngularJS--ui-router详解 原创 2016年07月26日 13:45:14 标签: angularjs / ui-router / ui-view 25043 1.配置使用ui- ...

  6. 教你如何使用github+jsDelivr搭建免费图床

    前言 之前写了一篇文章,教你如何使用Typora+PicGo实现图片自动上传到图床 . 这里我用的是七牛图床,七牛图床有一定的免费使用量(没记错的话应该是10个G),如果你的存储量超过这个大小就需要付 ...

  7. 部署LNMP环境

    1.安装nginx yum -y install gcc pcre-devel openssl-devel tar xf nginx-1.16.1.tar.gz cd nginx-1.16.1/ ./ ...

  8. 十八般武艺玩转GaussDB(DWS)性能调优(三):好味道表定义

    摘要:表结构设计是数据库建模的一个关键环节,表定义好坏直接决定了集群的有效容量以及业务查询性能,本文从产品架构.功能实现以及业务特征的角度阐述在GaussDB(DWS)的中表定义时需要关注的一些关键因 ...

  9. 【CF1445D】Divide and Sum 题解

    题目链接 题意简介 将一个长度为 2n 的数列平均分为两个子数列 p 和 q 后,p 按从小到大排序,q 按从大到小排序. 排序后,记 p 为 \(\{x_i\}\) ,q 为 \(\{y_i\}\) ...

  10. 我用 Python 撸了一个 plist 图集拆图工具!附上github源码

    这些年,我一直在使用 JavaScript .CocosCreator 做开发,只要是他们不能解决的,我都不太愿意去弄,或者说是不太情愿去做.真的是手中有把锤子,看什么都是钉子,越是熟悉一样东西,越容 ...