【洛谷P1983】车站分级 [NOIP2013普及]
今天做了两道绿题 调的有点久
还是拓扑排序的 这题主要是建图的关系 至于拓扑排序倒没过于深入
P1983 [NOIP 2013 普及组] 车站分级
题目背景
NOIP2013 普及组 T4
题目描述
一条单向的铁路线上,依次有编号为
注意:起始站和终点站自然也算作事先已知需要停靠的站点。
例如,下表是
现有
输入格式
第一行包含
第
输出格式
一个正整数,即
输入输出样例 #1
输入 #1
9 2
4 1 3 5 6
3 3 5 6
输出 #1
2
输入输出样例 #2
输入 #2
9 3
4 1 3 5 6
3 3 5 6
3 1 5 9
输出 #2
3
说明/提示
对于
对于
对于
解法&&个人感想
我们来看看题干所说的 “对于一个停靠的站,等级大于等于它的站一定停靠”
我们不能判断其他停靠站跟它是同级还是大于 但是我们反着想想
WOW!只要不停地就是比它小的 于是思路就出来了
注意:vis数组是必要的 因为给出的是该死的第i个车站 而且第1个是起始站 第n个是终止站
所以不能用st[i]去循环 而应该在一开始打个标记
欧耶!
这题我采用了邻接矩阵和vector来存图
vector是动态数组 也就是根据输入自动调整大小的数组
a.push_back(x)表示把元素x插入vector的末尾
而a.size()返回a的元素数量 注意 vector的下标从0开始
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,tot,s;
int edge[1005][1005],deg[1005];
vector<int>pvz[1005];
int vis[1005];
int st[1005];
struct node{
int ver,rank;
};
queue<node>q;
int ans;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
memset(st,0,sizeof(st));
memset(vis,0,sizeof(vis));
scanf("%d",&s);
for(int j=1;j<=s;j++){
scanf("%d",&st[j]);
vis[st[j]]=1;
}
for(int j=1;j<=s;j++){
for(int k=st[1];k<=st[s];k++){
if(!vis[k]&&!edge[k][st[j]]){
edge[k][st[j]]=1;
pvz[k].push_back(st[j]);
deg[st[j]]++;
}
}
}
}
for(int i=1;i<=n;i++){
if(!deg[i]){
q.push(node{i,1});
}
}
while(!q.empty()){
node x=q.front();q.pop();
for(int i=0;i<pvz[x.ver].size();i++){
int y=pvz[x.ver][i];
--deg[y];
if(!deg[y]){
ans=max(ans,x.rank+1);
q.push(node{y,x.rank+1});
}
}
}
printf("%d",ans);
system("pause");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】