AcWing 456. 车站分级
原题链接AcWing 456. 车站分级
抽象出题意,停靠过的车站的等级一定严格大于为停靠过的车站的等级,且不存在环,例如车站\(A\)等级大于车站\(B\),则\(A >= B + 1\),不妨从\(B\)向\(A\)连一条边,表示等级关系,题目要求车站的最小等级中最大是多少,即求最长路,那这就是一个差分约束系统。
而对于差分约束系统:
如果边权有正有负:则使用\(spfa\)
如果边权非负,那么可以使用\(tarjan\)缩点+递推,\(拓扑排序 + 递推\)的方式求最长路或者最短路。
同时,对于本题,把未停靠的站点和停靠的分成两个集合,那么需要连边最坏情况下是要\(n^2\),考虑最坏情况下,一共有\(1000\)趟车,每一趟都是从1~n站,其中停靠了\(500\)个站,还有\(500\)个未停靠,那么这时候连边就是\(500 * 500 * 1000 = 250000000\),显然,复杂度爆炸,但是考虑一种优化,在集合中间建立虚拟结点,左边边权是\(0\),右边边权是\(1\),那么就优化成了\(O(n + m)\)连边方式了,再算一下最坏情况下的数据量,\((500 + 500) * 1000 = 1000000\),这样就可以过了,直接优化成了线性,并且完全等价于\(O(n^2)\)连边的方式。

// Problem: 车站分级
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/458/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
const int N = 2010, M = 1E6 + 10;
int h[N], e[M], ne[M], w[M], idx;
int n, m;
int d[N];
int dist[N];
int seq[N], cnt;
bool st[N];
void add(int a, int b, int c) {
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
d[b]++;
}
void topsort() {
queue<int> q;
for (int i = 1; i <= n + m; i++) {
if (!d[i]) q.push(i);
}
while (q.size()) {
int t = q.front();
q.pop();
seq[cnt++] = t;
for (int i = h[t]; ~i; i = ne[i]) {
int j = e[i];
if (--d[j] == 0) q.push(j);
}
}
}
int main() {
scanf("%d%d", &n, &m);
memset(h, -1, sizeof h);
for (int i = 1; i <= m; i++) {
int cnt;
scanf("%d", &cnt);
memset(st, 0, sizeof st);
int start = n, end = 1;
while (cnt--) {
int k;
scanf("%d", &k);
start = min(start, k);
end = max(end, k);
st[k] = true;
}
int vir = n + i;
for (int j = start; j <= end; j++) {
if (!st[j]) add(j, vir, 0);
else add(vir, j, 1);
}
}
topsort();
for (int j = 1; j <= n; j++) dist[j] = 1;
for (int j = 0; j < n + m; j++) {
int var = seq[j];
for (int k = h[var]; ~k; k = ne[k]) {
dist[e[k]] = max(dist[e[k]], dist[var] + w[k]);
}
}
int res = 0;
for (int i = 1; i <= n; i++) res = max(res, dist[i]);
printf("%d\n", res);
return 0;
}
AcWing 456. 车站分级的更多相关文章
- 洛谷P1983 车站分级
P1983 车站分级 297通过 1.1K提交 题目提供者该用户不存在 标签图论贪心NOIp普及组2013 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 求帮忙指出问题! 我这么和(diao ...
- 【洛谷P1983】车站分级
车站分级 题目链接 首先,可以发现火车停靠站点的大小是没有什么规律的, 火车可以停靠在级别<=当前级别的站点,必须停靠在级别>=当前最高级别的站点 但是所有没有被停靠的站点级别一定比所有被 ...
- 【NOIP2013 普及组】车站分级
[NOIP2013 普及组]车站分级 一.题目 [NOIP2013 普及组]车站分级 时间限制: 1 Sec 内存限制: 128 MB 提交: 3 解决: 0 [提交][状态][讨论版] 题目描述 ...
- 洛谷P1983车站分级
洛谷\(P1983\)车站分级(拓扑排序) 目录 题目描述 题目分析 思路分析 代码实现 题目描述 题目在洛谷\(P1983\)上 题目: 一条单向的铁路线上,依次有编号为 \(1, 2, -, ...
- 洛谷 P1983 车站分级
题目链接 https://www.luogu.org/problemnew/show/P1983 题目描述 一条单向的铁路线上,依次有编号为 1,2,…,n的 n个火车站.每个火车站都有一个级别,最低 ...
- 洛谷P1983车站分级题解
题目 这个题非常毒瘤,只要还是体现在其思维难度上,因为要停留的车站的等级一定要大于不停留的车站的等级,因此我们可以从不停留的车站向停留的车站进行连边,然后从入度为0的点即不停留的点全都入队,然后拓扑排 ...
- NOIp2013 车站分级 【拓扑排序】By cellur925
题目传送门 我们注意到,题目中说:如果这趟车次停靠了火车站 x,则始发站.终点站之间所有级别大于等于火车站x的都必须停靠.有阶级关系,满满的拓扑排序氛围.但是,如果我们按大于等于的关系连,等于的情况就 ...
- luogu1980 车站分级
题目大意 一些火车站排成一行.给出一些火车的停靠站情况,要求对每一个火车,其经过且不停靠的站的级别比它任意停靠的站的级别小.问所有车站最少需要多少个级别. 题解 不要只看到这道题的背景设立在一个区间上 ...
- [NOIP2013]车站分级 解题报告
妈蛋这道普及组水(神)题搞了我非常久. 一. 首先一个非常显然的事情就是每一个火车告诉了站与站之间的等级关系,所以拓扑求最长路. 可是发现暴力建边的话最坏能够达到500*500,所以时间复杂度有O(M ...
- LG1983 「NOIP2013」车站分级 拓扑排序
问题描述 LG1983 题解 考虑建立有向边\((a,b)\),代表\(a\)比\(b\)低级. 于是枚举每一辆车次经过的车站\(x \in [l,r]\),如果不是车辆停靠的车站,则从\(x\)向每 ...
随机推荐
- Avalonia项目在OpenKylin运行踩坑
Avalonia项目在OpenKylin运行踩坑 本篇博客记录OpenKylin开源操作系统中运行Avalonia项目遇到的各种问题,会一直更新,最新的内容请点击文末的链接跳转到我的博客原文地址查看. ...
- 2021-3-9 excel导出
public void ExportExcel(DataTable dt) { //要添加epplus的nuget包 ExcelPackage.LicenseContext = LicenseCont ...
- 关于NOI2010“超级钢琴”的反思
[NOI2010] 超级钢琴 题目描述 小 Z 是一个小有名气的钢琴家,最近 C 博士送给了小 Z 一架超级钢琴,小 Z 希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出 \(n\ ...
- Django创建数据库时设置字符集
在控制台输入一下命令: create database 数据库名 charset=utf8;
- python分割多个分隔符
想一次指定多个分隔符,可以用re模块 import retext='3.14:15'result = re.split('[.:]', text)print(result) 输出结果如下: ['3', ...
- Could not extract response: no suitable `HttpMessageConverter` found for response type [class wechat.xx] and content type [text/plain] 问题
1. 问题复现 话不多说,先贴出问题代码:这里的GetUserInfoByAccessToken是我自定义的一个实体类. GetUserInfoByAccessToken getUserInfoByA ...
- 遥遥领先 spring,中国人的 solon 来啦!10% 的体积,10倍的速度
Solon 是什么? Java 生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(历时五年,已有全球第二级别的生态规模).与其他框架相比,它解决了两个重要的痛点:启动慢,费内存.2023 ...
- Python 潮流周刊#16:优雅重要么?如何写出 Pythonic 的代码?
你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中两则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...
- 选择合适的方法进行API接口调试
随着互联网的快速发展,API(Application Programming Interface)接口在软件开发中扮演着重要的角色.调试API接口是确保系统正常运行的关键步骤之一.本文将介绍如何选择适 ...
- Leetcode刷题笔记——二分法
二分法是搜索算法中极其典型的方法,其要求输入序列有序并可随机访问.算法思想为 输入:有序数组nums,目的数值target 要求输出:如果target存在在数组中,则输出其index,否则输出-1 将 ...