luogu1983 车站分级 (拓扑排序)
对每趟车建一个虚点p,对于不停车的x,连边(x,p,1);对于停车的y,连边(p,y,0)
有一条边(a,b,l)就是说b-a>=l
由于题目保证一定能走,直接拓扑序dp算最大的就行了
#include<bits/stdc++.h> #define pa pair<int,int> #define CLR(a,x) memset(a,x,sizeof(a)) using namespace std; typedef long long ll; const int maxn=2e3+10,maxm=2e6+10; inline ll rd(){ ll x=0;char c=getchar();int neg=1; while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();} while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); return x*neg; } struct Edge{ int b,l,ne; }eg[maxm]; int egh[maxn],ect,N,M,f[maxn],ine[maxn]; queue<int> q; inline void adeg(int a,int b,int c){ eg[++ect].b=b,eg[ect].l=c,eg[ect].ne=egh[a],egh[a]=ect; ine[b]++; } int main(){ //freopen("","r",stdin); int i,j,k; N=rd(),M=rd(); for(i=1;i<=M;i++){ int p=N+i; j=rd()-1,k=rd(); adeg(p,k++,0); for(;j;j--){ int x=rd(); for(;k<x;k++) adeg(k,p,1); adeg(p,k++,0); } } for(i=1;i<=N+M;i++) if(!ine[i]) q.push(i); int ans=0; while(!q.empty()){ int p=q.front();q.pop(); for(i=egh[p];i;i=eg[i].ne){ int b=eg[i].b;ine[b]--; f[b]=max(f[b],f[p]+eg[i].l); ans=max(ans,f[b]); if(!ine[b]) q.push(b); } } printf("%d\n",ans+1); return 0; }
分类:
2.————图论————
, 2拓扑排序
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)