P1983 [NOIP2013 普及组] 车站分级——拓扑排序+dp

news2025/1/14 0:53:53

[NOIP2013 普及组] 车站分级

题目描述

一条单向的铁路线上,依次有编号为 $1, 2, …, n $的 $n $个火车站。每个火车站都有一个级别,最低为 1 1 1 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 x x x,则始发站、终点站之间所有级别大于等于火车站$ x$ 的都必须停靠。(注意:起始站和终点站自然也算作事先已知需要停靠的站点)

例如,下表是$ 5 趟车次的运行情况。其中,前 趟车次的运行情况。其中,前 趟车次的运行情况。其中,前 4$ 趟车次均满足要求,而第 5 5 5 趟车次由于停靠了 3 3 3 号火车站( 2 2 2 级)却未停靠途经的 6 6 6 号火车站(亦为 2 2 2 级)而不满足要求。

现有 m m m 趟车次的运行情况(全部满足要求),试推算这$ n$ 个火车站至少分为几个不同的级别。

输入格式

第一行包含 2 2 2 个正整数 n , m n, m n,m,用一个空格隔开。

i + 1 i + 1 i+1 ( 1 ≤ i ≤ m ) (1 ≤ i ≤ m) (1im)中,首先是一个正整数 s i ( 2 ≤ s i ≤ n ) s_i(2 ≤ s_i ≤ n) si(2sin),表示第$ i$ 趟车次有 s i s_i si 个停靠站;接下来有$ s_i$个正整数,表示所有停靠站的编号,从小到大排列。每两个数之间用一个空格隔开。输入保证所有的车次都满足要求。

输出格式

一个正整数,即 n n n 个火车站最少划分的级别数。

样例 #1

样例输入 #1

9 2 
4 1 3 5 6 
3 3 5 6

样例输出 #1

2

样例 #2

样例输入 #2

9 3 
4 1 3 5 6 
3 3 5 6 
3 1 5 9

样例输出 #2

3

提示

对于$ 20%$的数据, 1 ≤ n , m ≤ 10 1 ≤ n, m ≤ 10 1n,m10

对于 50 % 50\% 50%的数据, 1 ≤ n , m ≤ 100 1 ≤ n, m ≤ 100 1n,m100

对于 100 % 100\% 100%的数据, 1 ≤ n , m ≤ 1000 1 ≤ n, m ≤ 1000 1n,m1000

分析

  1. 只要是涉及到级别、优先级,要干什么,就必须先干什么的这类型的题,我们就要考虑到拓扑排序;此题状态转移方程和1352:【例4-13】奖金——拓扑排序一样,并且同样也是拓扑排序;
  2. 火车没有停的车站,一定比上面的停过的车站等级小,所以 没经过的停车站 指向 经过的停车站;所以vis标记下经过的停车站,存进stop,然后后续建边用;
  3. f[i]的含义就是第i个车站的等级,首先f初始化为1,表示最少都是一个级别,状态转移方程和奖金一样,f[v] = max(f[v], f[u] + 1);前面的结点指向后面结点,那说明就不在一层,尽量少分为几个不同的级别,所以+1,前后相差一个级别即可(奖金那个尽可能少发钱,那他的上司比下一级多1元即可,和这个题的状态转移方程一样);
  4. 为了防止重边,用一个visEdge去标记已经建立过的边RE的都是因为没有处理重边造成的,一开始多组输入,我把标记重边的visEdge也初始化了,这不等于没有处理重边,一直RE…,太难受了;
#include <bits/stdc++.h>

using namespace std;

const int N = 1010, M = 1010 * 1010 / 2;
int n, m, ans;
int f[N];
int h[N], e[M], ne[M], idx;//邻接表
int d[N];//入度
int q[N];//队列
int vis[N];//标记车站是否停靠了
int visEdge[N][N];//标记边是否已经建了
int stop[N];//存放每个车次停靠的车站

void add(int a, int b) {
    e[++idx] = b, ne[idx] = h[a], h[a] = idx;
}

void topSort() {
    int hh = 0, tt = -1;
    //度0入队
    for (int i = 1; i <= n; ++i) {
        if (!d[i])
            q[++tt] = i;
    }
    while (hh <= tt) {
        //队头出队
        int u = q[hh++];
        //遍历u指向的边
        for (int i = h[u]; ~i; i = ne[i]) {
            int v = e[i];
            //删除u->v这条边
            d[v]--;
            //前后差一级即可
            f[v] = max(f[v], f[u] + 1);
            if (!d[v])
                q[++tt] = v;
        }
    }
}

int main() {
    memset(h, -1, sizeof h);
    cin >> n >> m;
    for (int i = 1; i <= m; ++i) {
        memset(vis, 0, sizeof vis);
        int cnt;
        cin >> cnt;
        for (int j = 1; j <= cnt; ++j) {
            cin >> stop[j];
            //将火车停靠的车站标记1
            vis[stop[j]] = 1;
        }
        //没有停的车站,一定比上面经过停车站的车站等级小,所以 没经过的停车站 指向 经过的停车站
        for (int j = stop[1]; j <= stop[cnt]; ++j) {
            if (!vis[j]) { //表示j是没有停的
                for (int k = 1; k <= cnt; ++k) { //经过的停车站
                    if (!visEdge[j][stop[k]]) {//避免重边
                        visEdge[j][stop[k]] = 1;
                        add(j, stop[k]);
                        d[stop[k]]++;//入度++
                    }
                }
            }
        }
    }
    //初始化f
    for (int i = 1; i <= n; ++i) {
        f[i] = 1;
    }
    topSort();
    for (int i = 1; i <= n; ++i) {
        ans = max(f[i], ans);
    }
    cout << ans;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二进制转化成十进制进行输出

给定两个十进制整数 : AAA,BBB 你需要把它们的二进制形式以十进制的运算法则相加输出结果。 例如&#xff1a; A3,B2A 3 , B 2A3,B2 的时候&#xff0c;AAA 的二进制表示是 : 111111 , BBB 的二进制表示是 101010 &#xff0c;你需要输出答案为 : 212121 输入描述: 一行两…

educoder:实验13 算法-穷举法和二分法

第1关&#xff1a;百钱百鸡 任务描述 我国古代数学家张丘建在《算经》一书中提出的数学问题&#xff1a;鸡翁一值钱五&#xff0c;鸡母一值钱三&#xff0c;鸡雏三值钱一。百钱买百鸡&#xff0c;问鸡翁、鸡母、鸡雏各几何&#xff1f; 相关知识 为了完成本关任务&#xff…

和ChatGPT大战多个回合,我知道了这些真相

最近&#xff0c;ChatGPT在国内外社交平台上可谓是火出圈了。作为一款人工智能语言模型&#xff0c;它可以和人类以对话的方式进行互动&#xff0c;比你早已熟知的Siri&#xff0c;小度还有小爱同学要更加智能与专业。因为它除了回答问题外还能进行创作&#xff0c;比如写小作文…

喜报 | Bonree ONE 2.0荣获信通院“2022IT新治理年度明星产品”

近日&#xff0c;由信通院“GOLFIT新治理领导力论坛”评选的2022IT新治理年度明星产品重磅出炉&#xff0c;博睿数据一体化智能可观测平台Bonree ONE 2.0凭借卓越的产品力以及优秀的用户体验&#xff0c;从一众产品中脱颖而出&#xff0c;获得“2022IT新治理年度明星产品”。 …

第06讲:Security在前后端分离项目中的综合应用

一、基本业务开发 1.1、需求分析 由于Security对用户进行鉴权和授权是通过用户名去数据库中取权限&#xff0c;所以我们需要开发一个功能&#xff0c;这个功能就是通过username去数据库里查该用户所具备的所有权限 1.2、完成需求 1.2.1、数据库脚本 请下载文章末尾的源代码…

JavaScript高级 |深入闭包

本文已收录于专栏⭐️ 《JavaScript》⭐️ 学习指南&#xff1a;闭包基本概念内存管理垃圾回收GC算法-标记清除GC算法-标记整理GC算法-分代收集GC算法-增量收集GC算法-闲时收集内存泄露完结散花参考文献闭包 闭包是JavaScript中非常容易让人迷惑的知识点。 《在你不知道的Java…

灯泡与影子(三分)

题目描述: 有一天&#xff0c;小明发现他的影子长度随着他在灯泡和墙壁之间走动时会发生变化&#xff0c;一个突发奇想在他的脑海里闪过&#xff0c;他现在想知道他来回走动&#xff0c;他的影子的最大长度是多少&#xff1f; 输入格式: 第一行包含一个整数T (T < 100),表…

C语言 常用标准库函数代码实现

一、内存 1. memcpy函数 memcpy 函数用于 把资源内存&#xff08;src所指向的内存区域&#xff09; 拷贝到目标内存&#xff08;dest所指向的内存区域&#xff09;&#xff1b;拷贝多少个&#xff1f;有一个size变量控制拷贝的字节数&#xff1b; 函数原型&#xff1a;void …

网络工程毕业设计 SSM汽车租赁系统(源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品&#xff0c;【基于SSM的汽车租赁…

mitmproxy 抓包神器-2.抓取Android 和 iOS 手机 https 请求

前言 抓取手机请求的前提条件是确保手机和电脑在同一网段上&#xff0c;也就是说使用同一WiFi。 启动服务 mitmweb 命令启动服务&#xff0c;默认监听8080端口 (venv) D:\demo\mitmproxy_xuexi>mitmweb [11:59:49.361] HTTP(S) proxy listening at *:8080. [11:59:49.36…

linux redhat8.0 权限管理

在linux里面&#xff0c;一切皆文件&#xff0c;不同的用户对文件有不同的管理权限&#xff0c;而只有root用户能为其他用户分配权限。 读&#xff08;r&#xff09;写&#xff08;w&#xff09;执行&#xff08;x&#xff09;数字表示421文件&#xff08;默认644&#xff09;…

SpringBoot-OneDay

优势 创建独立的spring程序自动配置spring简化的maven配置内嵌tomcat提供生产就绪型功能&#xff0c;如指标&#xff0c;健康检查和外部配置特性 为基于Spring 的开发提供更快的入门体验 开箱即用&#xff0c;没有代码生成&#xff0c;也无需XML 配置。同时也可以修改默认值来…

【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】

目录1. NiN块介绍2. 构建NiN模型3.NIN模型每层输出形状4. 获取Fashion-MNIST数据和训练NiN模型5. 总结前几篇文章介绍的LeNet、AlexNet和VGG在设计上的共同之处是&#xff1a;先以由卷积层构成的模块充分抽取空间特征&#xff0c;再以由全连接层构成的模块来输出分类结果。其中…

RocketMQ基本概念及功能

文章目录背景架构模型NameServer 名字服务器Broker 代理服务器生产者主题队列消息消息标签消息位点消费者消费位点消费者分组订阅关系参考文章背景 RocketMQ是阿里巴巴在2012年开发的分布式消息中间件&#xff0c;专为万亿级超大规模的消息处理而设计&#xff0c;具有高吞吐量…

【VScode插件开发】<二>插件实践开发+发布

开发环境配置完&#xff0c;就得好好琢磨开发内容了&#xff0c;不能老停留在hello world上呀&#xff01; 一、开发文档结构分析 1.Package.json {"name": "kidtest","displayName": "KidTest","description": "for…

Gnoppix Linux系统发布

导读基于 Kali Linux 的 Linux 滚动发行版 Gnoppix 22.12 带来了 GNOME 43、Linux 内核 6.0 和新的升级。作为传统的现场 CD 发行版 Knoppix 项目的继承者&#xff0c;​​Gnoppix Linux​​ 是专门为渗透测试和反向工程而设计的。它为网页应用安全和数字权利保护进行了优化。除…

Java也可以轻松编写并发程序

如今&#xff0c;多核处理器在服务器&#xff0c;台式机及笔记本电脑上已经很普遍了&#xff0c;同时也被应用在更小的设备上&#xff0c;比如智能手机和平板电脑。这就开启了并发编程新的潜力&#xff0c;因为多个线程可以在多个内核上并发执行。在应用中要实现最大性能的一个…

SpringBoot+Vue实现前后端分离的小而学在线考试系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

访问者模式(Visitor)

参考&#xff1a; 模板方法设计模式 (refactoringguru.cn) design-patterns-cpp/TemplateMethod.cpp at master JakubVojvoda/design-patterns-cpp GitHubhttps://github.com/JakubVojvoda/design-patterns-cpp/blob/master/state/State.cpp) 文章目录一、什么是访问者模式…

【Python机器学习】Sklearn库中Kmeans类、超参数K值确定、特征归一化的讲解(图文解释)

一、局部最优解 采用随机产生初始簇中心 的方法&#xff0c;可能会出现运行 结果不一致的情况。这是 因为不同的初始簇中心使 得算法可能收敛到不同的 局部极小值。 不能收敛到全局最小值&#xff0c;是最优化计算中常常遇到的问题。有一类称为凸优化的优化计算&#xff0c;不…