首页 > 其他分享 >[ABC305E] Art Gallery on Graph

[ABC305E] Art Gallery on Graph

时间:2023-06-13 23:36:18浏览次数:55  
标签:Art ABC305E Graph define int push 顶点 include dis

Art Gallery on Graph の 传送门

Problem

有一个由 \(N\) 个点 \(M\) 边的简单无向图,顶点编号为 \(1\) 到 \(N\),边的编号为 \(1\) 到 \(M\)。

第 $ i $ 条边连接着点 $ a_i $ 和 $ b_i $。

在一些点上有编号为 \(1\) 到 \(K\) 的 \(K\) 个守卫。

守卫 $ i $ 位于顶点 $ p_i $,保护范围为 $ h_i \(。(这里所有的\) p_i $都是相互不同的)

如果一个点 $ v $ 满足以下条件,则称为被保护的点

  • 至少存在一个守卫 $ i $,使得点 $ v $ 与点 $ p_i $ 之间的距离小于或等于 $ h_i $。

顶点 $ u $ 和顶点 $ v $ 之间的距离是连接顶点 $ u $ 和顶点 $ v $ 的路径上的最小边数。

输出所有被保护的顶点,顺序是从小到大

Solution

因为 \(i\) 号守卫可以保护距离不超过 \(h_i\) 的点,所以考虑定义 \(f_i\) 为 \(i\) 点可以保护的距离。

初始化:

  1. 将 \(f\) 全赋为 \(-1\);
  2. 把每个守卫的 \(f\) 值设为 \(h_i\)。

然后从 \(1\) 点开始 BFS,对于当前点 \(u\),遍历 \(u\) 连的点 \(v\)。

然后用 f[u] - 1 更新 \(f_v\),如果更新成功,就将 \(v\) 加入处理用来处理的优先队列 \(q\)。

\(q\) 要从大到小的顺序,因为每次更新都是把当前点 \(u\) 的 \(f\) 值减少,为了尽量让 \(f_u\) 更大以更新更多的点,应让 \(q\) 从大到小。

特殊的,如果当前点 \(u\) 的 \(f_u \le 0\) 时,\(u\) 就对答案没有贡献,所以直接 continue

Code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define int long long
#define pi pair<int,int>
#define mk make_pair
#define w first
#define v second
const int N = 2e5 + 5;
int n, m, k;
int vis[N], dis[N];
vector<int> g[N];
vector<int> ans;
priority_queue<pi> q;
signed main() {
    cin >> n >> m >> k;
    while (m--) {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    memset(dis, -1, sizeof(dis));
    while (k--) {
        int u, w;
        cin >> u >> w;
        dis[u] = w;
        q.push(mk(w, u));
    }
    while (!q.empty()) {
        int v = q.top().v;
        q.pop();
        for (int i : g[v])
            if (dis[i] < dis[v] - 1) {
                dis[i] = dis[v] - 1;
                q.push(mk(dis[i], i));
            }
    }
    for (int i = 1; i <= n; ++i)
        if (dis[i] >= 0)	ans.push_back(i);
    cout << ans.size() << '\n';
    for (int i : ans)   cout << i << ' ';
    return 0;
}

标签:Art,ABC305E,Graph,define,int,push,顶点,include,dis
From: https://www.cnblogs.com/StrayerTen/p/ABC305E.html

相关文章

  • 将MultipartFile对象转换成File对象
    将MultipartFile对象转换成File对象//将MultipartFile对象转换成File对象privateFileconvertToFile(MultipartFilemultipartFile)throwsIOException{//获取文件名StringfileName=Objects.requireNonNull(multipartFile.getOriginalFilename......
  • ZYNQ 裸机模式下修改默认uart端口
    ##背景调试ZYNQ裸机code,调用printf()后在UART端口无法看到打印信息输出,查看原理图后发现,板子用的UART1作为默认串口调试接口,UART0分配给了RS485使用,因此需要修改默认的STD接口到UART0,那么如何修改呢? ##修改默认STD的UART接口打开bsp中的,mss文件,然后选择modifythi......
  • Arthas使用教程(8大分类)
    文章目录一、简介1、简介2、项目所在位置二、安装Arthas1、安装Arthas2、卸载Arthas3、首次启动。三、核心监视功能1、`monitor`:监控方法的执行情况2、`watch`:检测函数返回值3、`trace`:根据路径追踪,并记录消耗时间4、`stack`:输出当前方法被调用的调用路径5、`tt`:时间隧道,记录多个......
  • 代码随想录算法训练营第24天 | ● 理论基础 ● 77. 组合 - 第7章 回溯算法part01
     第七章 回溯算法part01今日内容: ●  理论基础 ●  77. 组合    详细布置   理论基础  其实在讲解二叉树的时候,就给大家介绍过回溯,这次正式开启回溯算法,大家可以先看视频,对回溯算法有一个整体的了解。 题目链接/文章讲解:https://programmercar......
  • 代码随想录算法训练营第25天 | ● 216.组合总和III ● 17.电话号码的字母组合 - 第7章
     第七章 回溯算法part02 今日内容:  ●  216.组合总和III●  17.电话号码的字母组合  详细布置   216.组合总和III  如果把 组合问题理解了,本题就容易一些了。  题目链接/文章讲解:https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%B......
  • dojo\dart脚本编程语言
    Dojo是一个用于构建高效、可扩展的Web应用程序的开源JavaScript框架。它提供了一系列功能丰富的模块和组件,包括DOM操作、事件处理、异步编程、动画效果等。Dojo还具有强大的用户界面(UI)工具包Dijit,可以帮助开发人员轻松实现各种复杂的界面交互。Dojo的主要特点包括:1.模块化:Dojo采......
  • 自定义SpringBoot的starter
    1.自定义starter名为my-starter-spring-boot-starter1.1idea中创建一个maven模块groupId为com.exampleartifactId为my-starter-spring-boot-starter起名规范:1.官方starter是spring-boot-starter-xxxx2.自定义starter是xxx-spring-boot-starter依赖如下<?xmlversion="1.0......
  • SMARTFORMS 符号
    Smartform中,打印输出格式会经常出现问题,特别是金额、数量字段,如何解决打印时负号后置的问题呢?其实很简单:&field(<)&符号位显示在数据的左边补充:输出格式设置说明&field+&对于字符变量设置从何位置显示数据,如果offset大于字符变量长度时,系统......
  • 「解题报告」CF1815E Bosco and Particle
    好像不难。但是没想到。首先这玩意看起来就得拆开,要不然完全做不了。假如我们只考虑某一个点\(i\),考虑\(i-1\toi,i\toi+1\)这两条边的经过次数,不难发现其它的点是不会影响这两条边的。那么我们可以直接依据题意模拟,只考虑这一个点的周期是多长,然后所有的周期\(\mat......
  • TypeScript进阶--命名空间(跟着ChartGpt学习)
    以下都是我的ChartGpt老师教学的内容哦,(若想知道怎么用ChartGpt学习,或者想知道我的问答方式,可以点这个查看我的学习记录)一:理解命名空间的概念和作用命名空间是一种组织代码结构的方式,它将相关的代码放在一个命名空间内,避免命名冲突和代码重复。在TypeScript中,命名空间是通过关键......