CF Grakn Forces 2020 1408E Avoid Rainbow Cycles(最小生成树)
1408E Avoid Rainbow Cycles
概述
非常有趣的题目(指解法,不难,但很难想)
非常崇拜300iq,今天想做一套div1时看见了他出的这套题Grakn Forces 2020,就立马开始补这套题,果然不出我所料,全是iq题(误
题目
m个set中有1-n的一些数,首先我们可以把一个数 j 从set i 中删除,代价是 \(a[i]+b[j]\) ,至于为什么要删除之后再说
接着我们对于每个set i,\(\forall x,y \in i\),建边\((x,y)\)并染色为 \(i\) 。
最后我们定义\(Rainbow Cycle\)为从某个节点x 出发,经过一个回路能够重新回到x 且,回路中的边颜色两两各不相同
问题是求出最小的删除费用使得图中没有\(RainbowCycle\)
题解
核心:建图跑最小生成树
建图方式:数 \(j\) 在set \(i\) 里就建一条边\((n+i,j)\) ,这样实际上每个\(x,y\)在set里的都已经联通了,\(RainbowCycle\) 其实就变成了新图里的一条普通回路
问题就很明显了,一个没有环的图且删边费用最小就是最大生成树
总结
给\((x,y)\)边染色为\(z\),可以增加一个新节点\(n+z(防止点重复)\) ,建两条边\((x,n+z),(n+z,y)\) 这样方便对边进行操作
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+10;
int pre[N],tot=0;
ll a[N],b[N];
struct E
{
int x,y;
ll val;
E(int x1,int y1,ll val1){
x=x1;y=y1;val=val1;
};
E(){
x=y=val=0;
};
}edge[2*N];
bool cmp(E x,E y)
{
return x.val>y.val;
}
int find(int x)
{
if(pre[x]==x) return x;
else return pre[x]=find(pre[x]);
}
int merge(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx==fy) return 0;
pre[fx]=fy;
return 1;
}
int main()
{
int n,m;
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++) scanf("%lld",&a[i]);
for(int j=1;j<=n;j++) scanf("%lld",&b[m+j]);
for(int i=1;i<=m+n;i++) pre[i]=i;
for(int i=1;i<=m;i++){
int x;scanf("%d",&x);
for(int j=1;j<=x;j++){
int y;scanf("%d",&y);
E cnt(i,m+y,a[i]+b[m+y]);
edge[++tot]=cnt;
}
}
sort(edge+1,edge+tot+1,cmp);
ll res=0;
for(int i=1;i<=tot;i++){
E cnt=edge[i];
int x=cnt.x,y=cnt.y;
if(merge(x,y)){
continue;
}
else{
res+=cnt.val;
//cout<<x<<' '<<y<<' '<<cnt.val<<endl;
}
}
printf("%lld\n",res);
}
CF Grakn Forces 2020 1408E Avoid Rainbow Cycles(最小生成树)的更多相关文章
- Grakn Forces 2020 ABCDE题解
看到老外评论区中说,这场的难度估计是\(div.1\)和\(div.1.5\)的合并 A. Circle Coloring #构造 题目链接 题意 给定三个长度为\(n\)数组\(a,b,c\),要你 ...
- Grakn Forces 2020
比赛链接:https://codeforces.com/contest/1408 A. Circle Coloring 题意 给出三个长为 $n$ 的序列 $a,b,c$,对于每个 $i$,$a_i ...
- Effective Objective-C [上]
网上看到的 http://esoftmobile.com/2013/08/10/effective-objective-c/ 本文是针对<Effective Objective-C>一书的 ...
- ios中strong和weak的解释理解
来自stackoverflow解释的挺有意思的 Imagine our object is a dog, and that the dog wants to run away (be dealloca ...
- A million requests per second with Python
https://medium.freecodecamp.com/million-requests-per-second-with-Python-95c137af319 Is it possible t ...
- Linux内存管理 (15)页面迁移
专题:Linux内存管理专题 关键词:RMAP.页面迁移. 相关章节:反向映射RMAP.内存规整. 页面迁移的初衷是为NUMA系统提供一种将进程迁移到任意内存节点的能力,后来内存规整和内存热插拔场景都 ...
- Effective Objective-C [下]
http://esoftmobile.com/2013/08/17/effective-objective-c-2/ Chapter 6: Blocks and Grand Central Dispa ...
- Objective-C Properties
Objective-C Properties Apple introduced properties, a combination of new compiler directivesand a ne ...
- apache ignite系列(八):问题汇总
1,java.lang.ClassNotFoundException Unknown pair 1.Please try to turn on isStoreKeepBinary in cache s ...
随机推荐
- PyQt(Python+Qt)学习随笔:QAbstractItemView的alternatingRowColors属性
老猿Python博文目录 老猿Python博客地址 alternatingRowColors属性用于控制视图中不同行记录背景色是否使用交替不同的颜色. 如果此属性为True,则将使用QPalette. ...
- 安装pyspider出现的问题
本文来自微信公众号:coder_xiaobu,欢迎关注 一.安装pyspider pip install pyspider 二.启动 pyspider all 三.安装中出现的问题处理 安装的时候出现 ...
- nodjs html 转 pdf
var fs = require('fs');var pdf = require('html-pdf');//模块//读取html 文件 var html = fs.readFileSync('./s ...
- Java集合源码分析(十)——TreeSet
简介 TreeSet就是一个集合,里面不能有重复的元素,但是元素是有序的. TreeSet其实就是调用了TreeMap实现的,所以,它也不是线程安全的.可以实现自然排序或者根据传入的Comparato ...
- Vue组件化开发(原有项目的改造)
将组件定义成一个js和css,然后供其他页面进行调用 demo.html <!DOCTYPE html> <html> <head> <meta charse ...
- Day5 - 01 函数及函数的调用概念
函数就是最基本的一种代码抽象的方式.函数只需写一次,就可以多次调用.Python本身内置了很多有用的函数,可以直接调用. 调用函数 要调用一个函数,需要知道函数的名称和参数.可以通过help(x ...
- 使用MDNS进行局域网服务发现(.NET Core)
使用MDNS进行局域网服务发现(.NET Core) 想要服务写的好,配置文件不可少.如果是一个复杂的系统,甚至配置文件都是需要进行动态调整的,做起来好像就不是那么方便了,通常情况下,asp.net ...
- C# 好代码学习笔记(1):文件操作、读取文件、Debug/Trace 类、Conditional条件编译、CLS
目录 1,文件操作 2,读取文件 3,Debug .Trace类 4,条件编译 5,MethodImpl 特性 5,CLSCompliantAttribute 6,必要时自定义类型别名 目录: 1,文 ...
- react第二十单元(react+react-router-dom+redux综合案例2)
第二十单元(react+react-router-dom+redux综合案例2) #课程目标 #知识点 #授课思路 #案例和作业
- 找和为K的两个元素
总时间限制:1000ms 内存限制: 65536kB 描述 在一个长度为n(n < 1000)的整数序列中,判断是否存在某两个元素之和为k. 输入 第一行输入序列的长度n和k,用空格分开. 第二 ...