当前位置: 首页 > news >正文

AtCoder Beginner Contest 401 E题 题解

E - Reachable Sethttp://E - Reachable Set

题意概述 :

给定一个无向图,

对于每个  k=1\sim n,解决以下问题:

-选择最少的一些顶点,使得删除这些顶点及其关联的所有边后 点1能到达1 \sim k以内的所有


牵制芝士 :头文件,建图,带权并查集


题解 :

首先,我们可以将题目拆成两部分

1 :判断一个点能不能实现目标

2 :对于能实现的点,计算答案


第一部分 :

可以用并查集来处理

只与比k小的节点连边,并统计与1所在集合的节点数

由于只与比k小的节点连边,所以集合中只会有小于等于k的节点

所以当且仅当点1所在集合的节点数等于k时,点1才会与1\sim k都联通

第二部分 :

使用vis数组标记目前是否能从1\sim k直接扩展到点x

ans表示vis值为1的节点的个数

所有大于k能扩展点,都需要被删除

因为只处理能实现目标的节点,所以答案就是ans-k

代码 :

#include<bits/stdc++.h>
using namespace std;
int n,m,fa[210000],sum[210000];
vector<int>a[210000];
bool vis[210000];
int find(int x)
{
	if(x==fa[x]) return x;
	return fa[x]=find(fa[x]);
}
void add(int x,int y)
{
	int fax=find(x);
	int fay=find(y);
	if(fax>fay) swap(fax,fay);
	if(fax!=fay)
	{
		sum[fax]+=sum[fay];
		fa[fay]=fax;
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
		sum[i]=1;
	}
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		a[x].push_back(y);
		a[y].push_back(x);
	}
	vis[1]=1;
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<a[i].size();j++)
		{
			if(a[i][j]<i) add(a[i][j],i);//第一部分
			if(!vis[a[i][j]]) ans++;//第二部分
			vis[a[i][j]]=1;
		}
		printf("%d\n",sum[1]!=i?-1:(ans-i));
	}
	return 0;
}

相关文章:

  • 文件包含靶场
  • sql 向Java的映射
  • docker compose搭建博客wordpress
  • 基于springboot的“流浪动物管理系统”的设计与实现(源码+数据库+文档+PPT)
  • Losson 4 NFS(network file system(网络文件系统))
  • 地毯填充luogu
  • 【CS*N是狗】亲测可用!!WIN11上禁用Chrome自动更新IDM插件
  • 使用PyTorch实现目标检测边界框转换与可视化
  • 深入探讨MySQL存储引擎:选择最适合你的数据库解决方案
  • 【微服务】SpringBoot 整合 Lock4j 分布式锁使用详解
  • 网络安全课程笔记整理
  • CTF--bp
  • Spring开发系列教程(15)——DAO
  • 力扣每日打卡 1922. 统计好数字的数目 (中等)
  • 时序约束高级进阶使用详解二:Set_Min_Delay
  • C++多线程编程时的伪共享问题及其定位和解决
  • LLMs之Agent之A2A:A2A的简介、安装和使用方法、案例应用之详细攻略
  • 制作一款打飞机游戏教程2:背景滚动
  • ISIS协议(动态路由协议)
  • Java基础:一文讲清多线程和线程池和线程同步
  • 中国旅游日|上天当个“显眼包”!低空经济的“飞”凡魅力
  • 一箭六星,朱雀二号改进型遥二运载火箭发射成功
  • 机器人为啥热衷“搞体育”,经济日报:是向加速融入日常生活发起的冲锋
  • 词条数量大幅扩充,《辞海》第八版启动编纂
  • 美F-35险被胡塞武装击中,损失增大让行动成“烂尾仗”
  • 农行回应“病重老人被要求亲自取钱在银行去世”:全力配合公安机关调查