当前位置: 首页 > news >正文

题解:洛谷 P1983 [NOIP 2013 普及组] 车站分级

【题目来源】

洛谷:[P1983 NOIP 2013 普及组] 车站分级 - 洛谷

【题目描述】

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

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

image

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

【输入】

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

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

【输出】

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

【输入样例】

9 2 
4 1 3 5 6 
3 3 5 6 

【输出样例】

2

【算法标签】

《洛谷 P1983 车站分级》 #拓扑排序# #普及+#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int N = 1005;  // 定义最大节点数int n, m;            // n-节点数,m-关系组数
int board[N][N];     // 邻接矩阵表示图
int lvl[N];          // 存储每个节点的层级
int ans;             // 存储最终结果(最大层级)
int num;             // 临时变量,存储每组关系的节点数
int B[N];            // 标记数组,用于处理每组关系
int a, b, t;         // 临时变量,用于输入处理
queue<int> qu;       // 队列用于拓扑排序// 计算节点x的入度
int du(int x)
{int res = 0;for (int i = 1; i <= n; i++)res += board[i][x];  // 统计所有指向x的边return res;
}// 拓扑排序算法
void topo()
{// 初始化:将所有入度为0的节点加入队列for (int i = 1; i <= n; i++){if (du(i) == 0){lvl[i] = 1;      // 初始层级为1qu.push(i);}}// 处理队列中的节点while (qu.size()){int tmp = qu.front();qu.pop();// 遍历所有邻接节点for (int i = 1; i <= n; i++){if (board[tmp][i])  // 如果存在边tmp->i{board[tmp][i] = 0;  // 删除这条边if (du(i) == 0)     // 如果i的入度变为0{lvl[i] = lvl[tmp] + 1;  // 更新层级qu.push(i);}}}}
}int main()
{cin >> n >> m;// 处理每组关系while (m--){cin >> num;memset(B, 0, sizeof(B));  // 清空标记数组vector<int> st;  // 存储该组的起始节点vector<int> ed;  // 存储该组的结束节点// 输入该组的所有节点cin >> a;B[a] = 1;st.push_back(a);for (int i = 2; i < num; i++){cin >> t;st.push_back(t);B[t] = 1;}cin >> b;B[b] = 1;st.push_back(b);// 找出a和b之间未被标记的节点for (int i = a + 1; i < b; i++){if (B[i] == 0)ed.push_back(i);}// 建立起始节点到结束节点的边for (int i = 0; i < st.size(); i++){for (int j = 0; j < ed.size(); j++){board[st[i]][ed[j]] = 1;}}}// 执行拓扑排序topo();// 找出最大层级for (int i = 1; i <= n; i++){ans = max(ans, lvl[i]);}cout << ans << endl;return 0;
}

【运行结果】

9 2 
4 1 3 5 6 
3 3 5 6
2
http://www.jsqmd.com/news/392398/

相关文章:

  • 这几天的大模型圈,真的有点“卷”过头了
  • 企业H5站点升级PWA (五)
  • 题解:洛谷 P1017 [NOIP 2000 提高组] 进制转换
  • 企业H5站点升级PWA (六)
  • 企业H5站点升级PWA (七)
  • 企业H5站点升级PWA (四)
  • 题解:洛谷 P3916 图的遍历
  • 【硬盘】个人数据备份的各种方式##37
  • 题解:洛谷 P5318 【深基18.例3】查找文献
  • 题解:洛谷 P4017 最大食物链计数
  • 题解:洛谷 P1113 杂务
  • 别只会用 getData!Watcher 注册源码流程全拆解
  • Java线程解析:5种线程创建方法及应用场景 - 指南
  • 题解:洛谷 P2814 家谱
  • 题解:洛谷 P3879 [TJOI2010] 阅读理解
  • 2024 年 09 月 二级真题(1)--数位之和
  • 2026年龙岩连城长汀红白喜事鼓吹铜管乐队演出推荐:客家非遗与市场化服务的平衡之选 - 小白条111
  • 题解:洛谷 P4305 [JLOI2011] 不重复数字
  • 12:内核ROP与提权技术
  • 13:现代内核保护机制与绕过技术
  • 14:跨架构内核漏洞利用差异
  • 超市在线销售与分析|基于Python + Django超市在线销售与分析系统(源码+数据库+文档)
  • AI知识图谱构建:企业智能搜索的底层架构
  • 大数据领域数据中台的教育培训机构数据分析
  • 一天一个开源项目(第26篇):ZeroClaw - 零开销、全 Rust 的自主 AI 助手基础设施,与 OpenClaw 的关系与对比
  • OpenClaw(Clawdbot)部署指南:2026年天翼云部署快速上手
  • 彼得林奇的“家庭作业“投资法
  • 实用指南:Elasticsearch:监控 LLM 推理和 Agent Builder 使用 OpenRouter
  • AI提示系统反馈机制设计:如何解决“反馈噪音”问题?
  • 企业H5站点升级PWA (一)