P1983车站分级
%%%rqy



我们注意到题目中这段话:

既然大于等于x的站都要停,那么不停的站的级别是不是都小于x?(这里讨论在始发站和终点站以内的站(注意这里是个坑))
我们可以找出每趟车没停的站,向所有停了的站建一条边,表示没停的站的级别<停了的站的级别,同时记录所有的站的入度
这样,一开始入度为0的站级别就是1。
对于那些入度不为0的点来说,它们的级别就是所有指向它的点中,级别最大的那个点的级别+1
for example

因为每个级别为a车站x不一定只有级别为a-1的车站向x连边。
那程序怎么实现呢?
据大佬说要跑拓扑排序(%%%ych)
简单的说:
先将所有入度为0的点入队,遍历它们的每条出边,将所有到达的点的入度-1。如果有入度为0的点,就将其入队,并且它的级别为当前出队的点的级别+1。当队空时,拓扑排序结束。
这样为什么能保证达到上图的效果呢?因为对于任意一点i来说,如果当前出队的点为j,若存在有连接i且级别比j大的点k,则k此时入度一定不为0(还没遍历j的出边时),就可以保证先算k的级别,再算i的级别了。
复杂的说,走这里
跑完拓扑排序,我们将所有点的级别sort一遍,找最大的,就是答案。
小坑见代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int aans,n,m,s[][],in[],head[],cnt,ans[];
bool jb[][];//b[i][j]为i到j是否建过边(不建重边)
queue <int> q;
struct Edge{
int to,next;
}edge[];//开大点(我也不知道最多有几条边,总之开小了会wa)
void add(int fr,int to)//前向星存图
{
cnt++;
edge[cnt].to=to;
edge[cnt].next=head[fr];
head[fr]=cnt;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d",&s[i][]);
bool rr[];int start,end;
memset(rr,,sizeof(rr));
for(int j=;j<=s[i][];j++)
{
scanf("%d",&s[i][j]);
rr[s[i][j]]=;//标记每个点是否到达 }start=s[i][];end=s[i][s[i][]];
for(int j=start;j<=end;j++)//注意一定是讨论始发站和终点站以内的车站(见样例)
{
if(!rr[j])
{
for(int k=;k<=s[i][];k++)
{
if(!jb[j][s[i][k]])//不建重边
{add(j,s[i][k]);
in[s[i][k]]++;//建边的时候统计入度
jb[j][s[i][k]]=;
}
}
}
}
}
for(int i=;i<=n;i++)
{
if(!in[i])
{
q.push(i);
ans[i]=;
}
}
while(!q.empty())//跑拓扑排序
{
int u=q.front();
q.pop();
for(int i=head[u];i;i=edge[i].next)
{
in[edge[i].to]--;
if(in[edge[i].to]==)
{
q.push(edge[i].to);
ans[edge[i].to]=ans[u]+;
}
}
}
sort(ans+,ans++n);
printf("%d",ans[n]);
}
P1983车站分级的更多相关文章
- 洛谷P1983 车站分级
P1983 车站分级 297通过 1.1K提交 题目提供者该用户不存在 标签图论贪心NOIp普及组2013 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 求帮忙指出问题! 我这么和(diao ...
- 洛谷P1983车站分级
洛谷\(P1983\)车站分级(拓扑排序) 目录 题目描述 题目分析 思路分析 代码实现 题目描述 题目在洛谷\(P1983\)上 题目: 一条单向的铁路线上,依次有编号为 \(1, 2, -, ...
- 洛谷 P1983 车站分级
题目链接 https://www.luogu.org/problemnew/show/P1983 题目描述 一条单向的铁路线上,依次有编号为 1,2,…,n的 n个火车站.每个火车站都有一个级别,最低 ...
- 洛谷P1983车站分级题解
题目 这个题非常毒瘤,只要还是体现在其思维难度上,因为要停留的车站的等级一定要大于不停留的车站的等级,因此我们可以从不停留的车站向停留的车站进行连边,然后从入度为0的点即不停留的点全都入队,然后拓扑排 ...
- 【luogu P1983 车站分级】 题解
题目链接:https://www.luogu.org/problemnew/show/P1983 符合了NOIP命题的特点,知识点不难,思维量是有的. step1:把题读进去,理解.得到 非停靠点的等 ...
- P1983 车站分级[拓扑]
题目描述 一条单向的铁路线上,依次有编号为 1, 2, -, n1,2,-,n的 nn个火车站.每个火车站都有一个级别,最低为 11 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟 ...
- 【洛谷P1983 车站分级】
这题好像是个蓝题.(不过也确实差不多QwQ)用到了拓扑排序的知识 我们看这些这车站,沿途停过的车站一定比未停的车站的级别高 所以,未停靠的车站向已经停靠的车站连一条边,入度为0的车站级别就看做1 然后 ...
- P1983 车站分级
题目描述 一条单向的铁路线上,依次有编号为 1, 2, …, n 的 n 个火车站.每个火车站都有一个级别,最低为 1 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车 ...
- Luogu P1983 车站分级
(一周没写过随笔了) 这道题有坑! 看到题目,发现这么明显(??)的要求顺序,还有什么想法,拓扑! 将每条路范围内等级大于等于它的点(不能重复(坑点1))和它连一条边,注意起点终点都要有(坑点2),然 ...
随机推荐
- 第五周课程总结&实验报告
一.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码.结果截图.) 统计该字符串中字母s出现的次数. 统计该字符串中子串"i ...
- 如何创建Windows虚拟机
Windows虚拟机搭建 第1步:运行"Vmware WorkStation",看到主页面,创建新的虚拟机 第2步:新建虚拟机向导——典型(推荐) 第3步:选择光盘映像文件 第4步 ...
- MySQL的练习
mysql登录:方法1:使用Command Line Client登录,缺点:不显示报错信息 方法2:使用cmd登录(cmd的常用:查看ip地址:ipcongfi-----定时关机:shutdown ...
- e.target与e.currentTarget的区别,事件冒泡与事件捕获 ,事件委托
e.target与e.currentTarget的区别:https://www.jianshu.com/p/1dd668ccc97a 事件冒泡与事件捕获 :https://www.jianshu.co ...
- Oracle数据库控制台常用命令
安装好数据库以后可以通过“Win+R”打开控制台,在控制台登录Oracle输入命令来操作数据库. SQLPlus命令: SQLPlus命令是用来登录Oracle数据库的命令,有两种写法,分别如下: ( ...
- [2019杭电多校第七场][hdu6656]Kejin Player
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意为从i级花费a元有p的概率升到i+1级,有1-p的概率降到x级(x<i),查询从L级升 ...
- 第017讲:函数 - Python的乐高积木
0. 你有听说过DRY吗? me:不知道 参考答案: 1. 都是重复一段代码,为什么我要使用函数(而不使用简单的拷贝黏贴)呢? me:函数可以设置参数. 参考答案:0) 可以降低代码量(调用函数只需要 ...
- C# System.Web.Caching.Cache类 缓存 各种缓存依赖
原文:https://www.cnblogs.com/kissdodog/archive/2013/05/07/3064895.html Cache类,是一个用于缓存常用信息的类.HttpRuntim ...
- SQL 常用语句(一)
--SQL 语句为表添加字段并设置默认值 alter table TableName add ColumnName int --字段类型 not null --是否为空 --默认值 --SQL 语句为 ...
- win32 socket编程(四)——服务器端实例(TCP)
//Server服务器端Server.cpp 1 // 定义控制台应用程序的入口点. // #include "stdafx.h" #include <winsock2.h& ...