[abc302f] Merge Set
F - Merge Set
显然要建图
首先,我们有一个粗略的想法,对于同一集合\(S_i\)内的元素,\(S_{i,j}\)与\(S_{i,j+1}\)间连一条无向的标号为\(i\)的边
那么题目显然是要我们跑最短路,若到达\(x\)的边为\(i\),然后从\(x\)向外走到点\(y\),走的边若还为\(i\),那么代价为\(0\),否则代价为\(1\)
也就是说,换边走需要\(1\)的贡献
所以考虑用集合\(S_i\)连向所有的\(S_{i,j}\),因为不换边代价为\(0\),所以\(S_i\rightarrow S_{i,j}\)的权值为\(0\),而换边走代价为\(1\),也就意味着若当前边的类型为\(S_i\),且当前点为\(S_{i,p}\),那么我们要换另一种类型的边走,也就是要从\(S_{i,p}\)走到\(S_j\)(\(S_{i,j}\in S_j\)),这时需要\(1\)的代价,所以\(S_{i,j}\rightarrow S_i\)的权值为\(1\)
那么只需要建立一个起点\(S\)连向所有包含了1
的集合,终点\(T\)就是M
,\(S\)到\(T\)的最短路就是所求的答案
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+5,M=5e5+5,INF=1e9;
int n,m,S,T;
int dis[N];
bool vis[N];
int head[N],cnt=1;
struct node{
int nxt,v,val;
}tree[(M<<1)+(N>>1)];
void add(int u,int v,int val){
tree[++cnt]={head[u],v,val},head[u]=cnt;
}
queue<int> q;
void solve(){
for(int i=1;i<=T;++i) dis[i]=INF;
q.push(S);
while(q.size()){
int u=q.front(); vis[u]=false,q.pop();
for(int i=head[u],v;i;i=tree[i].nxt)
if(dis[v=tree[i].v]>dis[u]+tree[i].val){
dis[v]=dis[u]+tree[i].val;
if(!vis[v]) q.push(v),vis[v]=true;
}
}
}
int main(){
scanf("%d%d",&n,&m),S=n+m+1,T=n+m;
for(int i=1,a,x;i<=n;++i){
scanf("%d",&a);
while(a--){
scanf("%d",&x),add(i,x+n,0),add(x+n,i,1);
if(x==1) add(S,i,0);
}
}
solve();
if(dis[T]==INF) printf("-1\n");
else printf("%d\n",dis[T]);
return 0;
}
[abc302f] Merge Set的更多相关文章
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
- SQL 提示介绍 hash/merge/concat union
查询提示一直是个很有争议的东西,因为他影响了sql server 自己选择执行计划.很多人在问是否应该使用查询提示的时候一般会被告知慎用或不要使用...但是个人认为善用提示在不修改语句的条件下,是常用 ...
- Merge Sorted Array
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...
- SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join
nested loops join(嵌套循环) 驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...
- Git 少用 Pull 多用 Fetch 和 Merge
本文有点长而且有点乱,但就像Mark Twain Blaise Pascal的笑话里说的那样:我没有时间让它更短些.在Git的邮件列表里有很多关于本文的讨论,我会尽量把其中相关的观点列在下面. 我最常 ...
- Merge 的小技巧
今天跟大家分享一下搬动数据使用Merge的方法. 有些时候,当我们做数据搬动的时候,有时候做测试啊,换对象啊,就会存在有时候外键存在,不知道怎么对应的关系.比如我现在有架构相同的两组table , A ...
- [LeetCode] Merge Sorted Array 混合插入有序数组
Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume tha ...
- [LeetCode] Merge Intervals 合并区间
Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8, ...
- [LeetCode] Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...
- [LeetCode] Merge Two Sorted Lists 混合插入有序链表
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
随机推荐
- Draw.io:你可能不知道的「白嫖级」图表绘制神器
介绍 draw.io 是一个在 GitHub 上开源且拥有近十年发展历史的成熟项目,它是一款用于绘制 UML 图表的工具. 如果你曾经为流程图的绘制而流泪,又或是在夜里和UML大战到失眠, 不妨试试它 ...
- Delphi 时间控制窗口标题栏文字或任务栏标题文字滚动
1.定义一个全局变量保存显示到标题栏的字符串,strScroll: Widestring = '风行天下 - By WindSon '; 2.添加一个Timer控件,设置属性Interval := 3 ...
- 一文彻底拿下HarmonyOS NEXT开发实战调试技巧
> 程序员Feri一名12年+的程序员,做过开发带过团队创过业,擅长Java.嵌入式.鸿蒙.人工智能等,专注于程序员成长那点儿事,希望在成长的路上有你相伴!君志所向,一往无前! --- # 1. ...
- P5490 【模板】扫描线 & 矩形面积并 做题笔记
扫描线是一种很常用的 trick,用来计算矩形并周长.并面积.核心思路是使用标记永久化 + 线段树,直接引用朴素的做法,即从某一维度开始扫描并将经过的面积加和. 错误 upd 函数中的汇总不正确,要想 ...
- MONyog入门总结
1.安装步骤 1)安装MONyog_6.6.3.exe文件,步骤如下: 2)停止MONyog服务 3)将MONyog.exe和MONyog-patch.exe文件放到E:\MONyog\bin目录下 ...
- 事务注解@Transactional
目录 1.属性介绍 2.传播机制 准备例子 总结 3.原理 4.失效场景 一.属性介绍 1.isolation 属性 事务的隔离级别,默认值为 Isolation.DEFAULT.可选的值有: Iso ...
- python同时给多个邮箱地址发送邮件
这个帖子内讲了怎么发邮件:https://www.cnblogs.com/becks/p/14589314.html 下图红框内于发送目标邮件地址有关 讲红框内信息修改为下方代码,即可实现向多人发送邮 ...
- 康谋分享 | 数据隐私和匿名化:PIPL与GDPR下,如何确保数据合规?(二)
在上期数据隐私和匿名化系列文章中,我们主要分享了<中国个人信息保护法>(PIPL)和<欧盟通用数据保护条例>(GDPR)在涵盖范围.定义.敏感信息等方面的异同点,今天,我们将重 ...
- jmeter使用:解决压测时获取token问题
在执行压测过程中,首先要执行登录接口来获取token.如果并发数比较大只需要一个用户的登录token,可以使用setup线程组.如果是模拟多个用户登录获取token,需要使用仅一次控制器. 一.添加s ...
- C#自动属性提供默认值的方法
编程之路转自:cjavapy.com/article/55/ _ .NET(C#)中,自动属性(Auto-Implemented Properties)提供了一种简洁的方式来实现属性而无需显式定义字 ...