洛谷 1983 车站分级
题目描述
一条单向的铁路线上,依次有编号为 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 个火车站最少划分的级别数。
输入输出样例
9 2 4 1 3 5 6 3 3 5 6
2
9 3 4 1 3 5 6 3 3 5 6 3 1 5 9
3
说明
对于 20%的数据,1 ≤ n, m ≤ 10;
对于 50%的数据,1 ≤ n, m ≤ 100;
对于 100%的数据,1 ≤ n, m ≤ 1000。
思路:对于每一个停靠的车站向不停靠的车站连边,拓扑排序后求最长路即可。拓扑排序保证无后效性,最长路保证级数递减时总级别最小。
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<cmath>using namespace std;const int MAXN=1010;
struct edge
{int next,to,val;
};
edge e[MAXN*MAXN*2];
int head[MAXN*MAXN],cnt;
bool build[MAXN][MAXN];
int n,m;
int in[MAXN],q[MAXN],l,r,dis[MAXN];
bool a[MAXN][MAXN];
int stop[MAXN];
inline void addedge(int u,int v)
{e[++cnt].next=head[u];e[cnt].to=v;in[v]++; head[u]=cnt;
}
inline void tp_sort(int n)
{for (int i=1;i<=n;i++){if (!in[i]){q[++r]=i;dis[i]=1;}}while (l<r){int x=q[++l];for (int i=head[x];i;i=e[i].next){in[e[i].to]--;if (!in[e[i].to]){ q[++r]=e[i].to;dis[e[i].to]=dis[x]+1;}}}
}
int main()
{scanf("%d%d",&n,&m);int longest=0;for (int i=1;i<=m;i++){int s;bool p=true;scanf("%d",&s);for (int j=1;j<=s;j++){scanf("%d",&stop[j]);a[i][stop[j]]=1;}longest=max(longest,stop[s]);for (int k=stop[1];k<=stop[s];k++){if (!a[i][k]){for (int j=1;j<=s;j++){ if (!build[stop[j]][k]){addedge(stop[j],k);build[stop[j]][k]=1;}}}}}tp_sort(longest);int ans=0;for (int i=1;i<=longest;i++){ans=max(ans,dis[i]);}cout<<ans;return 0;
}
洛谷 1983 车站分级相关推荐
- 洛谷-1983 车站分级
题目描述 一条单向的铁路线上,依次有编号为 1,2,-,n的 n个火车站.每个火车站都有一个级别,最低为 1级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 x,则始 ...
- 洛谷 P1983 车站分级(拓扑排序)
https://www.luogu.com.cn/problem/P1983 思路 对于每一趟车,将其经过的车站中,停靠的和不停靠的连一条边,注意边的去重,要双向标记,不然有个点会超时,这样拓扑排序递 ...
- 洛谷 P1983 车站分级
嗯... 听说这是一道存图+拓扑排序的题,但是看了一晚上好像只看出存图来.... 自己太蒟蒻,然后没办法,就.....就借用了Mr Kevin的代码和思路,然后自己做了一些了解... (并且现在自己对 ...
- 洛谷P1983 车站分级(拓扑排序)
[题目描述] 一条单向的铁路线上,依次有编号为 1 , 2 , - , n 1,2,\dots ,n 1,2,-,n的 n n n个火车站.每个火车站都有一个级别,最低为 1 1 1级.现有若干趟车次 ...
- 洛谷P1983 车站分级(图的建立)
题目描述 一条单向的铁路线上,依次有编号为 1, 2, -, n的 n个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 ...
- 洛谷P1983 车站分级 拓扑排序
题目链接:https://www.luogu.com.cn/problem/P1983 此题是用拓扑排序求层数,将等级高的点连向等级的点,连成的图用拓扑排序看一下多少层,即答案. 代码如下 #incl ...
- 洛谷 P1983 车站分级
题目描述 一条单向的铁路线上,依次有编号为 1, 2, -, n 的 n 个火车站.每个火车站都有一个级 别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车 次停靠了 ...
- 洛谷P1983 车站分级
这题有三种做法 1.O(nm2)1.O(nm2)1.O(nm^2) 488ms / 9.61MB / 0.68KB 不用讲,直接贴代码 #include<bits/stdc++.h> us ...
- [NOIP1998] 提高组 洛谷P1011 车站
题目描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起( ...
最新文章
- JQuery EasyUI学习框架
- c++ string replace_Java——String类的常用方法总结
- 编程之美 set 12 快速找出故障机器
- 杭州云栖大会阿里云放大招,8K远程医疗会诊引关注
- python集合操作班级干部竞选演讲稿_精选竞选班干部的演讲稿集合7篇
- mfc 固定编辑框输入上限和下限_S7200smart的模拟量输入输出
- SQLServer数据库写入操作时报错:not all arguments converted during string formatting 问题解决
- 1.Grettings and Introductions
- win7系统文件夹共享后有锁图标怎么去掉?
- 东航手机值机选座推荐
- Jenkins踩坑:Failed to connect to repository : Error performing git command: git ls-remote -h http://17
- 机器学习公开课笔记第一周
- 局域网唤醒计算机,电脑远程开机_局域网唤醒电脑 | 茶杯猫
- parker派克柱塞泵PV046R1K1T1NUDM
- 关于寻迹小车组装建议
- 机器人简化图画手绘图_机器人简笔画画法图片欣赏
- HTML: 点击链接时在新窗口打开
- 恩智浦刘立冬:推动虚拟化的实现,才能进一步实现NFV的部署
- celeron处理器_NISE3600E 基于第三代Intel Core i7/i5/i3处理器,无风扇系统,1个PCIex4扩展槽...
- 测试工程师-yy面试 cvte面试总结