本题是2013年NOIP普及组的压轴题

差分约束裸题。
计算当前线路中最小的级别(比较始发站和终点站)。
整条线路中所有大于这个级别的都必须停靠
所有未停靠的站点的级别一定小于这个级别

也就是说所有未停靠的即为级别低,记为A
所有停靠的站点级别一定比A的高,记作B
得到公式B≥A+1B ≥ A + 1B≥A+1
根据很明显是一道差分约束问题。
根据差分约束的概念,我们从所有的A向所有的B连一条权值为1的有向边。

然后根据差分约束的套路,我们还要设一个界限才能求出最大值。

因为所有车站级别都是正值,所以A≥1A≥1A≥1,也就是从0向所有的A中的点连一条权值为1 的有向边。我们常常用直接给dist数组赋值为1代替

但是由于实际数据范围较大

最坏情况下是有1000趟火车,每趟有1000个点,每趟上限有500个点停站,则有(1000 - 500)个点不停站,不停站的点都向停站的点连有向边,则总共有 500∗500∗1000=2.5∗108500 * 500 * 1000 = 2.5 * 10^8500∗500∗1000=2.5∗108,差分约束的spfa有可能超时

由于本题中的所有点的权值都是大于0,并且一定满足要求=>=>=>所有车站都等级森严=>=>=>不存在环=>=>=>可以拓扑排序得到拓扑图使用递推求解差分约束问题。

因此整体的思路为

  • 拓扑排序得拓扑图
  • “至少”=>=>=>要求的是最小值=>=>=>所有条件的下界中取最大值=>=>=>最长路,因此我们,根据拓扑序跑最长路递推即可。
  • 答案为满足所有约束条件的解中最大值既是题目要求的最高的级别

一个建图的优化

如果直接暴力建图就会建O(nm)O(nm)O(nm)条边,也就是2∗1082*10^82∗108个点,时间和空间都有可能超时。

我们可以在中间建一个虚拟节点,左边向虚拟点连0,虚拟点向右边连1等价于左边向右边连1

这样只会建O(n+m)O(n + m)O(n+m)条边

注意的是本题一共m条线路,每条线路一个虚拟源点,所以一共会有n + m 个点。

当年出题人并没有卡这一点,不然要卡死一大批有志青年

如下图所示:

优化前

然后就是代码了

别忘了一共有n + m 个点

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>using namespace std;const int N = 2007, M = 5000007;int n, m;
int ver[M], nex[M], edge[M], head[N], tot;
int din[N];
int vis[N];
int q[N];
int dist[N];void add(int x, int y, int z){ver[tot] = y;edge[tot] = z;nex[tot] = head[x];head[x] = tot ++ ;din[y] ++ ;
}void toposort(){int hh = 0, tt = -1;for(int i = 1;i <= n + m;++i){//一共n + m个点,要遍历所有的点if(!din[i]){q[++ tt] = i;if(tt == N)tt = 0;}}while(hh <= tt){int x = q[hh ++ ];if(hh == N)hh = 0;for(int i = head[x];~i;i = nex[i]){int y = ver[i];if(-- din[y] == 0){q[++ tt] = y;if(tt == N)tt = 0;}}}
}int main(){scanf("%d%d", &n,&m);memset(head,-1,sizeof head);for(int i = 1;i <= m;++i){memset(vis,0,sizeof vis);int t,stop;scanf("%d",&t);int start = n, end = 1;while(t -- ){scanf("%d",&stop);//输入的是编号start = min(start, stop);end = max(end, stop);vis[stop] = true;//代表该站要停靠.}int source = n + i;//n + 1for(int j = start;j <= end;++j){//该线路上的所有经过的站点的编号一定在始发站和终点站之间if(vis[j])//要停靠,说明是右部点add(source, j, 1);else add(j, source, 0);}}toposort();for(int i = 1;i <= n;++i)//A ≥ 1dist[i] = 1;for(int i = 0;i < n + m;++i){//手写的队列是从0开始的int x = q[i];for(int j = head[x];~j;j = nex[j]){int y = ver[j], z = edge[j]; dist[y] = max(dist[y], dist[x] + z);}}int res = 0;for(int i = 1;i <= n;++i)//满足所有约束条件的解中最大值既是题目要求的最高的级别res = max(res, dist[i]);printf("%d\n",res);return 0;
}

解题报告:NOIP2013 车站分级(拓扑序递推求解差分约束、建图优化O(n+m)) 超详细讲解相关推荐

  1. 2019 ICPC Asia Nanjing Regional C.Digital Path(拓扑排序递推DP)

    整理的算法模板合集: ACM模板 题目传送门 三段题面,只有第三段是有用的-前两段又长单词又难懂,就是在讲故事...不过针对四种情况给出四个图帮助我们理解题意是真的赞,可能出题人怕我们看不懂吧(第一句 ...

  2. 整数划分问题【递归以及递推求解方式】

    简述 用一系列正整数之和来表示一个整数,称之为整数划分.而整数划分问题则对于某个数字,输出对应整数划分的数量. 先写递归,有了递归之后,就换用递推来加快速度. 算法思路 q(n, m)表示,n这个整数 ...

  3. hdu 2046 骨牌铺方格 递推求解

    骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

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

    [NOIP2013 普及组] 车站分级 题目描述 一条单向的铁路线上,依次有编号为 $1, 2, -, n $的 $n $个火车站.每个火车站都有一个级别,最低为 111 级.现有若干趟车次在这条线路 ...

  5. C++解题报告:病毒(virus)——拓扑排序

    题目描述 有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母. 现在怎么恢复原来的文档呢!小y很聪 ...

  6. P6134 [JSOI2015]最小表示(拓扑排序递推 + bitset优化,可达性统计变种)

    整理的算法模板合集: ACM模板 P6134 [JSOI2015] 题目要求删除一条边整个图的连通性是不受影响的,也就是说如果我们要删除边(x,y)(x,y)(x,y),删除以后整个图的连通性不受影响 ...

  7. 1192 奖金(拓扑排序求解差分约束问题)

    1. 问题描述: 由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金.公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多 ...

  8. c++过河卒(递推求解)题解

    大家好,我是屁孩君,今天屁孩君拿出一道十分典型的递推题跟大家分享. 先让我们来康康题目吧! A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马 ...

  9. 洛谷P1983 车站分级 拓扑排序

    题目链接:https://www.luogu.com.cn/problem/P1983 此题是用拓扑排序求层数,将等级高的点连向等级的点,连成的图用拓扑排序看一下多少层,即答案. 代码如下 #incl ...

最新文章

  1. Lua中的基本函数库
  2. QT笔记:数据库总结(三)之SQL模型类-QSqlTableModel模型
  3. virtualenv wrapper安装配置
  4. c语言程序设计题2015,2015年荐C语言程序设计等级考试习题汇编.doc
  5. django orm 操作表
  6. 利用openssl创建私有CA的步骤和过程
  7. 30分钟学习掌握springmvc、SSM
  8. 《零基础学算法 第3版》PDF 免费
  9. 苹果CMSv10自适应视频站原创挖片网高端seo收录模板
  10. sql数据库去重语法_SQL如何去重?
  11. Hibernate延迟加载-by宋迪
  12. EAO-SLAM: Monocular Semi-Dense Object SLAM Based on Ensemble Data Association
  13. 浅谈企业转型过程中的问题与对策
  14. C#学习笔记----C#连接MySQL数据库
  15. 《数据结构与算法分析》课程设计——迷宫问题
  16. 美监管“叫停”BUSD!是时候了解一下值得期待的几个新DeFi 稳定币了
  17. 射频链路隔直电容选择
  18. 淘宝海报常见的英文字体精选,让你的设计更显逼格!
  19. Visual Studio 2019安装AutoCAD_2020_dotnet_wizards
  20. 施耐德Galaxy VX-数据中心模块化UPS的理想选择

热门文章

  1. 基于OpenCV提取特定区域方法汇总
  2. OpenCV寻找复杂背景下物体的轮廓
  3. 计算机视觉专家:如何从C++转Python
  4. 实战centos6安装zabbix-2.4版(终极版)
  5. 开机自动挂载与autofs触发挂载
  6. 前端魔法堂——异常不仅仅是try/catch
  7. SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务)
  8. 微软好绝情:Windows 7再无重大更新!
  9. 2011年5月系统分析师考试­
  10. RIM终于想通了-RIM开放新的API