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

走多远(拓扑排序,dp)

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
vector<int> g[N];
int in[N];
int d[N];

int main()
{
  int n,m;cin>>n>>m;
  while(m--){
    int u,v;cin>>u>>v;
    u--,v--;            // 转换为 0-based 索引
    g[u].push_back(v);  // 邻接表存边
    in[v]++;           // 计算入度
  }
  queue<int> q;
  for(int i=0;i<n;i++){
    if(in[i]==0){
      q.push(i);
    }
  }
  while(q.size()){
    int u=q.front();
    q.pop();
    for(int v:g[u]){
      d[v]=max(d[v],d[u]+1);   // 更新v的最远距离
      if(--in[v]==0){          // 入度减 1,若为 0 入队
        q.push(v);
      }
    }
  }
  int ans=*max_element(d,d+n);  // 获取最大的最远距离
  cout<<ans;
  return 0;
}

在有向无环图(DAG)中计算从入度为 0 的点出发的最长路径长度。

for (int v : g[u]) {
    d[v] = max(d[v], d[u] + 1);
}

这句话表示:"v 的最长路径 = max(当前的 v 的值, 从 u 走来加一条边的值)"

if (--in[v] == 0) {
    q.push(v);
}
v 的入度减 1(因为它的一个前驱 u 已经处理完了):如果入度变成 0,说明 v 所有前驱节点都已经处理完了。可以把 v 加进队列,表示继续遍历它指向的下一个节点

http://www.dtcms.com/a/123362.html

相关文章:

  • ChatRoom测试报告
  • 手眼标定-眼在手上
  • 安卓设备配置PAC代理服务器的完整指南:实现智能分流与开发加速
  • OfficePlus去掉PDF文件右键菜单里的PDF转换
  • Java Map和Set集合应用
  • docker安装nginx,基础命令,目录结构,配置文件结构
  • 0410 | 软考高项笔记:项目管理概述
  • jQuery多库共存
  • 甘特图和里程碑趋势图在项目监控中有哪些实际应用?
  • 本地laravel项目【dcat-admin】部署到liunx服务器
  • 论文笔记:Dynamic Spectral Graph Anomaly Detection
  • 先占个日常,等会写。
  • 如何白嫖Grok3 API? 如何使用Grok3 API调用实例?怎么使用Grok3模型?
  • 从零实现Agent智能体配置使用(Ragflow)
  • 多模态大模型在目标检测领域的最新进展
  • JS包装类型Object
  • AutoKeras 处理图像回归预测
  • spark-core学习内容总结
  • 【完美解决】VSCode连接HPC节点,已配置密钥却还是提示需要输入密码
  • 京华幻梦:科技自然共生诗篇
  • 【蓝桥杯】二分查找
  • springcloud进阶
  • SkyWalking + ELK 全链路监控系统整合指南
  • FPGA_DDR(二)
  • Go语言编写一个进销存Web软件的demo
  • python基础语法1:输入输出
  • Java 基础 - 反射(1)
  • Java学习——day26(线程同步与共享资源保护)
  • FastAPI用户认证系统开发指南:从零构建安全API
  • Cloudflare 缓存工作原理