洛谷P1983 车站分级
P1983 车站分级
- 297通过
- 1.1K提交
- 题目提供者该用户不存在
- 标签图论贪心NOIp普及组2013
- 难度普及/提高-
提交该题 讨论 题解 记录
最新讨论
- 求帮忙指出问题!
- 我这么和(diao)谐(zha)…
题目描述
一条单向的铁路线上,依次有编号为 1, 2, …, n 的 n 个火车站。每个火车站都有一个级
别,最低为 1 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车
次停靠了火车站 x,则始发站、终点站之间所有级别大于等于火车站 x 的都必须停靠。(注
意:起始站和终点站自然也算作事先已知需要停靠的站点)
例如,下表是 5 趟车次的运行情况。其中,前 4 趟车次均满足要求,而第 5 趟车次由于
停靠了 3 号火车站(2 级)却未停靠途经的 6 号火车站(亦为 2 级)而不满足要求。
现有 m 趟车次的运行情况(全部满足要求),试推算这 n 个火车站至少分为几个不同的
级别。
输入输出格式
输入格式:
输入文件为 level.in。
第一行包含 2 个正整数 n, m,用一个空格隔开。
第 i + 1 行(1 ≤ i ≤ m)中,首先是一个正整数 si(2 ≤ si
≤ n),表示第 i 趟车次有 si 个停
靠站;接下来有 si个正整数,表示所有停靠站的编号,从小到大排列。每两个数之间用一个
空格隔开。输入保证所有的车次都满足要求。
输出格式:
输出文件为 level.out。
输出只有一行,包含一个正整数,即 n 个火车站最少划分的级别数。
输入输出样例
Case 1:
9 2
4 1 3 5 6
3 3 5 6 Case 2:
9 3
4 1 3 5 6
3 3 5 6
3 1 5 9
Case 1:
2 Case 2:
3
说明
对于 20%的数据,1 ≤ n, m ≤ 10;
对于 50%的数据,1 ≤ n, m ≤ 100;
对于 100%的数据,1 ≤ n, m ≤ 1000。
分析:看到这道题的时候一点思路都没有......再读一次题发现也没有思路......再读一次终于明白了题目的意思.在火车从起点到终点的所有站点中,停靠的站点的车站级别一定比不停靠的高,设起点为s,终点为t,如果只有一趟火车,那么所有停靠的站的等级只需要比不停靠的站的最高值多1即可.如果再增加一趟火车,这趟火车在上一趟火车的起始点之内,那么还要再+1,如果在起始点之外那么就和一趟火车一样处理,如果有n趟呢......可以想到如果拓扑排序.在起始点内不能停靠的站向可以停靠的站连有向边,然后找到入度为0的点(没有边指向的点),删除这个点和这个点所连出去的所有路径,路径指向的点的入度-1,当所有入度为0的点(撤销原入度为0后入度变为0在第一轮不解决)都解决了之后,进行下一轮,进行一轮就累加一下计数器,最后输出结果即可.这是拓扑排序的基本方法,很好理解,实在不能理解画个图就能理解了.还有一个问题,为什么要多个点在同一轮进行处理呢?可以想到如果按照之前提到的方式建图,那么就会有多个拓扑序列,我们可以认为每一次对所有的拓扑序列的操作是等价的,直到没有入度为0的点即可.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = ;
int n, m, flag[maxn], first, ans, vis[maxn], s, a[maxn], e[maxn][maxn], rudu[maxn], stack1[maxn], top; void init()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= m; i++)
{
memset(flag, , sizeof(flag));
scanf("%d", &s);
for (int j = ; j <= s; j++)
{
scanf("%d", &a[j]);
flag[a[j]] = ;
}
for (int j = a[]; j <= a[s]; j++)
if (!flag[j])
for (int k = ; k <= s; k++)
if (!e[j][a[k]])
{
e[j][a[k]] = ;
rudu[a[k]]++;
}
}
} void tp()
{
first = ;
while (top != || first)
{
first = ;
top = ;
for (int i = ; i <= n; i++)
if (!rudu[i] && !vis[i])
{
stack1[++top] = i;
vis[i] = ;
}
for (int i = ; i <= top; i++)
for (int j = ; j <= n; j++)
if (e[stack1[i]][j])
{
e[stack1[i]][j] = ;
rudu[j]--;
}
ans++;
}
ans--; //因为当top为0的时候累加器还在累加,所以最后要减去1
} int main()
{
init();
tp();
printf("%d", ans); return ;
}
洛谷P1983 车站分级的更多相关文章
- 洛谷P1983车站分级
洛谷\(P1983\)车站分级(拓扑排序) 目录 题目描述 题目分析 思路分析 代码实现 题目描述 题目在洛谷\(P1983\)上 题目: 一条单向的铁路线上,依次有编号为 \(1, 2, -, ...
- 洛谷 P1983 车站分级
题目链接 https://www.luogu.org/problemnew/show/P1983 题目描述 一条单向的铁路线上,依次有编号为 1,2,…,n的 n个火车站.每个火车站都有一个级别,最低 ...
- 洛谷P1983车站分级题解
题目 这个题非常毒瘤,只要还是体现在其思维难度上,因为要停留的车站的等级一定要大于不停留的车站的等级,因此我们可以从不停留的车站向停留的车站进行连边,然后从入度为0的点即不停留的点全都入队,然后拓扑排 ...
- 【洛谷P1983 车站分级】
这题好像是个蓝题.(不过也确实差不多QwQ)用到了拓扑排序的知识 我们看这些这车站,沿途停过的车站一定比未停的车站的级别高 所以,未停靠的车站向已经停靠的车站连一条边,入度为0的车站级别就看做1 然后 ...
- 洛谷 P1983 车站分级 拓扑排序
Code: #include<cstdio> #include<queue> #include<algorithm> #include<cstring> ...
- 【洛谷P1983】车站分级
车站分级 题目链接 首先,可以发现火车停靠站点的大小是没有什么规律的, 火车可以停靠在级别<=当前级别的站点,必须停靠在级别>=当前最高级别的站点 但是所有没有被停靠的站点级别一定比所有被 ...
- P1983 车站分级 思维+拓扑排序
很久以前的一道暑假集训的题,忘了补. 感觉就是思维建图,加拓扑排序. 未停靠的火车站,必然比停靠的火车站等级低,就可以以此来建边,此处注意用vis来维护一下,一个起点和终点只建立一条边,因为不这样的话 ...
- 题解【洛谷P1983】[NOIP2013]车站分级
题面 题解 不难想到拓扑排序 于是每一个等级高的向等级低的连一条边 考虑拓扑排序过程中的分层 对于每个点进行分层 于是答案就是这些点中的最大层数 然后就会RE 发现我们多连了一些重复的边 用一个标记数 ...
- 洛谷 洛谷 P1011 车站 Label:续命模拟QAQ 未知50分
题目描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起( ...
随机推荐
- HTTP协议下保证登录密码不被获取更健壮方式
说到在http协议下用户登录如何保证密码安全这个问题: 小白可能第一想法就是,用户在登录页面输入密码进行登录时,前台页面对用户输入的密码进行加密,然后把加密后的密码作为http请求参数通过网络发 ...
- codeblocks AStyle修改格式和快捷键
首先我想说 codeblocks还是很强大的,原来以为不能改,其实是不会,那么本篇博客就教大家修改AStyle格式和添加快捷键. 1.修改AStyle格式: Settings -> Editor ...
- NeHe OpenGL教程 第三十一课:加载模型
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- unity jiaoben
transform.Translate(Input.GetAxis("Horizontal")*Time.deltaTime,0,0); 移动 transform.Translat ...
- memcpy
函数原型 void *memcpy(void*dest, const void *src, size_t n); 功能 由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始 ...
- JavaScript笔记之数组 keyword(存储和释放&堆栈 & 按值 引用)
1.数组创建及初始化 var obj=new Array(); var arr=[]; 可以延伸为长度一定的,字面量定义数组 2.堆栈 按值传递 引用类型 数组是引用类型,不是值传递, 栈:系桶自动分 ...
- HTML5 - 使用<video>播放视频
,下面是一个播放视频的最简单样例 (controls属性告诉浏览器要有基本播放控件) <video src="hangge.mp4" controls></vid ...
- Ubuntu编写开机自启动脚本(转载)
From:http://blog.csdn.net/marujunyy/article/details/8466255 1.首先编写一个简单的shell脚本test.sh #! /bin/bash e ...
- Linux磁盘系统基础知识(转载)
From:http://www.liusuping.com/ubuntu-linux/linux-disk-basic.html 在Linux系统下对于IDE硬盘,每块盘有一个设备名:对应于主板的四个 ...
- proxmox3.2安装FreeBSD或者FreeNAS注意事项
别的不多说了,白般尝试,终于安装成功,原来硬件要如下设置才行,如下: 1)内存要开大点,512M 800M都不行,最后开导2G才可以,如下: 2)kvm硬件虚拟化一定要选择“否”,默认是“是”,这里 ...