codeforces 825 E Minimal Labels

2023-11-02

Problem

codeforces.com/contest/825/problem/E

Reference

看第 5 条评论

Meaning

给出一个n个结点的DAG,找一个给结点编号的序列,且满足3个条件:

  • 编号为 1~n,每个编号出现且仅出现一次;
  • 如果存在边从 f 指向 t,则结点 f 的编号要小于 t 的编号;
  • 在所有可行的编号序列中,取字典序最小的;

Analysis

第二个条件就像拓扑排序,再要满足足第三个条件,就在拓扑排序时,每次从所有入度为零的点中,找出最小的点并给它当前可用的最小的编号。
然而,这样做是错的。
比如样例:

---Input---
6 5
6 2
5 2
2 1
4 3
3 1
---Outpuut---
6 3 5 4 1 2

之前像上面那样写(有点像贪心),结果是:6 5 2 1 3 4
可能要先给某些大的点分配小的编号来“解锁”小的点,来取得更小的字典序。
按评论里给出的题解,是要反过来想,存反向边,每次也是考虑入度为零的点,但是选最大的点分配最大的编号。
评论里的证明原文(by krijgertje):

We can prove it by contradiction. Take any graph with the smallest number of nodes for which this algorithm does not give an optimal labeling. The largest label must always be assigned to a node with no outgoing edges, but it can’t be the largest of those nodes (otherwise the algorithm would give the optimal labeling). Lets call the largest node with no outgoing edges x and the node that has the largest label in the optimal labeling y. Then after labeling y with the largest label, the remaining part of the graph is correctly labeled by the algorithm (otherwise we would have a smaller graph for which the algorithm gives an incorrect result). This will first label some nodes greater than x and then it will label x. But we get a better labeling by labeling x with the largest label, y with the next largest and then label the same nodes as before. This is because of the nodes labeled so far y is the smallest node (since y < x and all other labelled nodes are greater than x) and in the partial labeling we have labeled the same nodes using the same labels. So we have a contradiction, which means our assumption was wrong and therefore there is no graph that our algorithm labels incorrectly.

Accepted Code

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int N = 100000, M = 100000;

vector<int> rev[N+1]; // reverse edge
int deg[N+1]; // degree of vertex
int label[N+1]; // label sequence
priority_queue<int> que;

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    memset(deg, 0, sizeof deg);
    for(int f, t, i=0; i<m; ++i)
    {
        scanf("%d%d", &f, &t);
        rev[t].push_back(f);
        ++deg[f];
    }
    for(int i=1; i<=n; ++i)
        if(!deg[i])
            que.push(i);
    for(int lab=n, t; lab > 0; --lab) // desc
    {
        t = que.top();
        que.pop();
        label[t] = lab;
        for(int i=0; i<rev[t].size(); ++i)
            if(--deg[rev[t][i]] == 0)
                que.push(rev[t][i]);
    }
    for(int i=1; i<=n; ++i)
        printf("%d%c", label[i], i==n?'\n':' ');
    return 0;
}

Wrong Code

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int N = 100000, M = 100000;

vector<int> g[N+1]; // edge
int deg[N+1];
int label[N+1];
priority_queue<int, vector<int>, greater<int> > que;

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    memset(deg, 0, sizeof deg);
    for(int f, t, i=0; i<m; ++i)
    {
        scanf("%d%d", &f, &t);
        g[f].push_back(t);
        ++deg[t];
    }
    for(int i=1; i<=n; ++i)
        if(!deg[i])
            que.push(i);
    for(int lab=1, t; lab <= n; ++lab) // ascend
    {
        t = que.top();
        que.pop();
        label[t] = lab;
        for(int i=0; i<g[t].size(); ++i)
            if(--deg[g[t][i]] == 0)
                que.push(g[t][i]);
    }
    for(int i=1; i<=n; ++i)
        printf("%d%c", label[i], i==n?'\n':' ');
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

codeforces 825 E Minimal Labels 的相关文章

  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • Android OpenGL ES2.0(一):详细讲解如何绘制一个三角形

    一 Android OpenGL ES2 0简介 1 什么是OpenGL OpenGL 全写Open Graphics Library 是指定义了一个跨编程语言 跨平台的编程接口规格的专业的图形程序接口 它用于三维图像 二维的亦可 是一个功
  • 缓存怎么测试?

    1 缓存的介绍 平时用的Redis缓存是一款高性能的内存型键值对 key value 数据库 是高并发场景常用一款存储中间件 其主要用于 缓存热点数据 减少DB的请求IO 其场景使用主要有 分布式锁 全局ID 计数器 限流 消息队列 购物车
  • 垃圾回收机制

    目录 一 为什么要有垃圾回收 二 垃圾回收主要回收哪个内存区域 三 垃圾判断算法 1 引用计数法 2 可达性分析法 四 垃圾回收算法 1 标记 清除算法 2 标记 整理算法 3 复制算法 4 分代收集算法 一 为什么要有垃圾回收 在 JVM
  • DRF请求与响应

    目录 Request类 常用参数 Response类 请求编码与相应编码 相应编码 Request类 经过rest framwork 传入视图函数的request已经不是原来的request了 而是Request的类产生的对象request
  • Docker 安装 Nginx(三)

    Nginx 是一个高性能的 HTTP 和反向代理 web 服务器 同时也提供了 IMAP POP3 SMTP 服务 以前没有用Docker时 直接在服务器中下载 安装 修改配置 运行Nginx 一套完整流程下来花费的时间也就那样 但是 自从
  • RabbitMQ - 消息堆积问题的最佳解决方案?惰性队列

    目录 一 惰性队列 1 1 消息堆积问题 1 2 消息堆积问题的解决方法 从消费者的角度 从队列的角度 1 3 引入惰性队列 1 3 1 什么是惰性队列 1 3 2 惰性队列的使用 1 3 3 效果演示 一 惰性队列 1 1 消息堆积问题
  • StringUtils.isEmpty和StringUtils.isBlank用法

    a target blank href http blog csdn net ocean20 article details 6674077 转载自 http blog csdn net ocean20 article details 66
  • Ubuntu22.04编译安装FFmpeg

    FFmpeg介绍 概述 FFmpeg是一款用C语言编写的跨平台免费开源多媒体处理工具 该软件可实现音视频的采集 编解码 转码 过滤以及流媒体相关操作等功能 同时 FFmpeg也为其他多种语言和操作系统提供了开发组件 包括Java Pytho
  • Android的init过程:init.rc解析流程

    这几天打算看下安卓的代码 看优秀的源码也是一种学习过程 看源码的过程就感觉到 安卓确实是深受linux内核的影响 不少数据结构的用法完全一致 花了一中午时间 研究了下init rc解析过程 做个记录 init rc 文件并不是普通的配置文件
  • Ant内置任务之unjar/untar/unwar/unzip

    一 概述 unjar untar unwar unzip是Ant内置任务 用于解压zip war或jar文件 PatternSet用于选择从存档中提取的文件 资源集合用于选择执行解压的存档文件 Unjar Unwar Unzip只支持基于文
  • 并发编程系列之Fork/Join

    前言 上节我们讲了阻塞队列 Java中的并发容器就算有了个基本的认识 今天我们来介绍一种线程工作模式 叫Fork Join 他是JDK7之后提供的一个并行执行框架 主要的思想我觉得是分而治之 将一个大的任务分成多个小的任务并行执行 然后等所
  • 成为技术传播者(二):Why and Why NOT

    前文 成为技术传播者 一 写在前面 Contributing to Eclipse的开篇第一句话说得很有味道 Humans need to feel nurtured and cared for Humans also need to nu
  • 关于vs编译错误CL.exe已退出的解决方案

    IDE问题 VS2010突然无法编辑C 项目 会报错误 30 error MSB6006 CL exe 已退出 代码为 1073741701 这个问题是 我也碰到了 你改一下设置就好了 一劳永逸 随便打开一个项目 点击 视图 gt 属性管理
  • Vue 项目打包之后,CSS 找不到问题

    Vue 项目打包之后 CSS 找不到问题 记录日常开发中遇到的 坑 问题 我把vue项目打包之后放在本地的web环境下可以正常显示 但是我放到 nginx 服务器之后 找不到 css 文件 当时配置如下图 解决办法 我将 打包的路径从 v4
  • fastx常用控件

    目录 表格控件 bootstrap table 日历控件 bootstrap datepicker 通用帮助框 单选 多选 bootstrap标签页 通过设置数据字典来设置下拉框的值 表格控件 bootstrap table 自带搜索框 等
  • c++文件读写操作

    1 声明头文件 include 2 实例化对象 ifstream fin ifstream是中的一个类 fin是一个实例化对象 之所以起这个名字是类比cin 实际上他们有很多相似的地方 3 fin open 文件名 打开方式 本文的打开方式
  • 【机器视觉】——裂纹检测笔记

    目录 传统算法处理裂缝的基本思路 第一种思路 第二种思路 第三种思路 CPP代码 halcon代码 python代码 Matlab代码 深度学习缺陷检测 裂缝检测文献 传统算法处理裂缝的基本思路 第一种思路 1 先转换彩色图为灰度图 2 进
  • MySQL 8.0 隐藏索引

    隐式索引 最明显的一个作用类似 索引回收站 例如数据库长时间运行后 会积累很多索引 做数据库优化时 想清理掉没什么用的多余的索引 但可能删除某个索引后 数据库性能下降了 发现这个索引是有用的 就要重新建立 对于较大的表来说 删除 重建索引的
  • python筑基——基础知识作业汇总,学习笔记

    作业一 语法 变量 输 输出 基本运算 基本数据类型 字符串 类型转换 1 计算整型50乘以10再除以5的商并使用print输出 result 50 10 5 print result 2 判断整型8是否大于10的结果并使用print输出
  • codeforces 825 E Minimal Labels

    Problem codeforces com contest 825 problem E Reference 看第 5 条评论 Meaning 给出一个n个结点的DAG 找一个给结点编号的序列 且满足3个条件 编号为 1 n 每个编号出现且