洛谷\(P1983\)车站分级(拓扑排序)

目录

  • 题目描述

  • 题目分析

  • 思路分析

  • 代码实现


题目描述

题目在洛谷\(P1983\)

题目:

一条单向的铁路线上,依次有编号为 \(1, 2, …, n1,2,…,n\)的 \(n\)个火车站。每个火车站都有一个级别,最低为 11 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 \(x\),则始发站、终点站之间所有级别大于等于火车站\(x\) 的都必须停靠。(注意:起始站和终点站自然也算作事先已知需要停靠的站点)

例如,下表是\(5\)趟车次的运行情况。其中,前\(4\)趟车次均满足要求,而第\(5\)趟车次由于停靠了\(3\)号火车站(\(2\)级)却未停靠途经的\(6\)号火车站(亦为\(2\)级)而不满足要求。

现有\(m\) 趟车次的运行情况(全部满足要求),试推算这\(n\)个火车站至少分为几个不同的级别。

输入输出格式:

输入:第一行包含\(2\)个正整数\(n, m\),用一个空格隔开。

第 \(i + 1\) 行\((1 ≤ i ≤ m)\)中,首先是一个正整数\(s_i(2 ≤ s_i ≤ n)\),表示第\(i\) 趟车次有\(s_i\) 个停靠站;接下来有\(s_i\)个正整数,表示所有停靠站的编号,从小到大排列。每两个数之间用一个空格隔开。输入保证所有的车次都满足要求。

输出:一个正整数,即\(n\)个火车站最少划分的级别数。


题目分析

​ 刚刚看到这道题时,我并没有读懂题,觉得是要用一个\(dp\)或者搜索什么的(也有可能是我搜索题做多了

看到题目,我们知道,假设一个车次从\(x\)车站驶向\(y\)车站,\(c_i\)表示第\(i\)个车站的车站等级。那么中间的\(c_i(x \leq i \leq y)\)一定满足\(c_i\leq c_x\)和\(c_i \leq c_y\)。这样的话,我们就可以构造出一个有向图,级别低的车站指向级别高的车站。这样一来,题目就转化成了拓扑排序的简单题了


思路分析

​ 根据上面的题目分析,我们可以得出以下解题方法:

首先将有向图建好,建图的方法是:对于每一个车次,其中停靠的车站我们不能确定与始发站和终点站的关系,那么我们就假设这些车站的等级是相同的,而中间没有停靠的车站则向停靠过的车站(包括始发站和终点站)连一条边。

进行了这项操作之后,我们发现这\(n\)个车站各自有不同的入度,按照入度进行排序,如果有不同的入度,\(ans++\)最后的\(ans\)就是我们要求的答案。


代码实现

#include<bits/stdc++.h>
using namespace std; const int MAXN=3000010;
const int maxn=1005; int head[MAXN],to[MAXN],nxt[MAXN];
int in[maxn],cnt,dep[maxn];
int a[maxn],flag[maxn],vis[maxn][maxn],ans;
//flag标记是否停靠,vis去重边 inline void add(int u,int v)
{
cnt++;
to[cnt]=v;
nxt[cnt]=head[u];
head[u]=cnt;
}//邻接链表存边 int n,m; int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
memset(a,0,sizeof(a));
memset(flag,0,sizeof(flag));
int k;
scanf("%d",&k);
for(int j=1;j<=k;j++)
{
scanf("%d",&a[j]);
flag[a[j]]=1;//标记
}
for(int j=a[1]+1;j<=a[k];j++)
{
if(!flag[j])
{
for(int p=1;p<=k;p++)
{
if(!vis[j][a[p]])
{
in[a[p]]++;
add(j,a[p]);
vis[j][a[p]]=1;
}
}
}
} } queue<int> q;
for(int i=1;i<=n;i++)
{
if(!in[i]) q.push(i),dep[i]=1;
//刚开始入度就为0的点深度为1
}
while(!q.empty())
{
int top=q.front();
q.pop();
for(int e=head[top];e;e=nxt[e])
{
int v=to[e];
dep[v]=max(dep[v],dep[top]+1);
//这个不加max也可以,因为下面的ans已经取过max了
//不过加上也没问题
ans=max(ans,dep[v]);//更新答案
in[to[e]]--;//入度--
if(!in[to[e]]) q.push(to[e]);
}
}
cout<<ans; }

这是\(ych\)大神的代码(本蒟蒻表示还不会写)

洛谷P1983车站分级的更多相关文章

  1. 洛谷P1983 车站分级

    P1983 车站分级 297通过 1.1K提交 题目提供者该用户不存在 标签图论贪心NOIp普及组2013 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 求帮忙指出问题! 我这么和(diao ...

  2. 洛谷 P1983 车站分级

    题目链接 https://www.luogu.org/problemnew/show/P1983 题目描述 一条单向的铁路线上,依次有编号为 1,2,…,n的 n个火车站.每个火车站都有一个级别,最低 ...

  3. 洛谷P1983车站分级题解

    题目 这个题非常毒瘤,只要还是体现在其思维难度上,因为要停留的车站的等级一定要大于不停留的车站的等级,因此我们可以从不停留的车站向停留的车站进行连边,然后从入度为0的点即不停留的点全都入队,然后拓扑排 ...

  4. 【洛谷P1983 车站分级】

    这题好像是个蓝题.(不过也确实差不多QwQ)用到了拓扑排序的知识 我们看这些这车站,沿途停过的车站一定比未停的车站的级别高 所以,未停靠的车站向已经停靠的车站连一条边,入度为0的车站级别就看做1 然后 ...

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

    Code: #include<cstdio> #include<queue> #include<algorithm> #include<cstring> ...

  6. 【洛谷P1983】车站分级

    车站分级 题目链接 首先,可以发现火车停靠站点的大小是没有什么规律的, 火车可以停靠在级别<=当前级别的站点,必须停靠在级别>=当前最高级别的站点 但是所有没有被停靠的站点级别一定比所有被 ...

  7. P1983 车站分级 思维+拓扑排序

    很久以前的一道暑假集训的题,忘了补. 感觉就是思维建图,加拓扑排序. 未停靠的火车站,必然比停靠的火车站等级低,就可以以此来建边,此处注意用vis来维护一下,一个起点和终点只建立一条边,因为不这样的话 ...

  8. 题解【洛谷P1983】[NOIP2013]车站分级

    题面 题解 不难想到拓扑排序 于是每一个等级高的向等级低的连一条边 考虑拓扑排序过程中的分层 对于每个点进行分层 于是答案就是这些点中的最大层数 然后就会RE 发现我们多连了一些重复的边 用一个标记数 ...

  9. 洛谷 洛谷 P1011 车站 Label:续命模拟QAQ 未知50分

    题目描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起( ...

随机推荐

  1. 使用 java 创建你的第一个区块链(第一部分)

    本系列教程的目的是帮助您了解如何开发区块链技术. 在本教程中,我们将: 创建你的第一个(非常)基本的“区块链”. 实施简单的工作证明(采矿)系统. 惊叹于可能性. (我假设您对面向对象编程有基本的了解 ...

  2. oracle 12C的新特性-CDB和PDB

    1.前言 CDB与PDB是Oracle 12C引入的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插 ...

  3. dedecms 缩略图路径修改

  4. oracle 之创建视图异常

    最近在整理的oracle 的时候发现.创建视图 例如: CREATE OR REPLACE VIEW dept_sum_vw(name,minsal,maxsal,avgsal) AS SELECT ...

  5. [CF 1238F] The Maximum Subtree 树DP

    题意 给定一颗树,求这个树的最大子树,且这个子树是一个good-tree. good-tree的定义是:每个节点可以表示成一个数值区间,而树上的边表示两个点表示的数值区间相交. 题解 通过分析可以发现 ...

  6. No training required: Exploring random encoders for sentence classification(解析)

    原文链接:https://arxiv.org/abs/1901.10444 发表在:ICLR 2019 ------------------------------------------------ ...

  7. nginx搭建及加固

    系统使用的是centos7 Nginx安装及配置 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务 安装 我是用的环境是ce ...

  8. 29.Jwt集成(3):token设置过期时间、异常判断

    token设置过期时间 package main import ( "fmt" "github.com/dgrijalva/jwt-go" "io/i ...

  9. 2019全国卷(III)理科23题的另类解法

    已知 $x,y,z\in\textbf{R}$且$x+y+z=1$ (1)求$(x-1)^2+(y+1)^2+(z+1)^2$的最小值: (2)若$(x-2)^2+(y-1)^2+(z-a)^2\ge ...

  10. 【BZOJ3534】【Luogu P3317】 [SDOI2014]重建 变元矩阵树,高斯消元

    题解看这里,主要想说一下以前没见过的变元矩阵树还有前几个题见到的几个小细节. 邻接矩阵是可以带权值的.求所有生成树边权和的时候我们有一个基尔霍夫矩阵,是度数矩阵减去邻接矩阵.而所谓变元矩阵树实际上就是 ...