Luogu P1137 旅行计划 【拓扑排序+Dp】By cellur925
由于满足游览先后顺序从西到东的性质,我们很自然的想到用拓扑排序处理出一个合理的游览顺序。
然鹅,之后呢?
事实上,拓扑排序常与Dp相结合,解决后效性。我们就可以在每次拓扑入队的时候更新答案,设f[i]表示终点为i能经过的最多城市数。则f[j]=max(f[j],f[i]+1).
*Update
思考的时候,没想到dp qwq. 知道要用dp后就想了很久,想出了记录前驱的方法,但是不太对。(挖坑)
code
1 #include<cstdio> 2 #include<algorithm> 3 #include<queue> 4 5 using namespace std; 6 7 int n,m,x,y,tot,cnt; 8 int head[100090],du[100090],f[100090]; 9 struct node{ 10 int next,to; 11 }edge[200090]; 12 13 void add(int x,int y) 14 { 15 edge[++tot].to=y; 16 edge[tot].next=head[x]; 17 head[x]=tot; 18 } 19 20 void topo() 21 { 22 queue<int>q; 23 for(int i=1;i<=n;i++) 24 if(!du[i]) q.push(i),f[i]=1; 25 while(!q.empty()) 26 { 27 int u=q.front();q.pop(); 28 for(int i=head[u];i;i=edge[i].next) 29 { 30 int v=edge[i].to; 31 f[v]=max(f[v],f[u]+1); 32 if(--du[v]==0) q.push(v); 33 } 34 } 35 } 36 37 38 int main() 39 { 40 scanf("%d%d",&n,&m); 41 for(int i=1;i<=m;i++) 42 scanf("%d%d",&x,&y),add(x,y),du[y]++; 43 topo(); 44 for(int i=1;i<=n;i++) 45 printf("%d\n",f[i]); 46 return 0; 47 }
独立意志与自由思想是必须争的,且须以生死力争。
分类:
图论--拓扑
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用