AT_dp_g Longest Path题解

题目描述

给定一个有 N 个顶点、M 条边的有向图 G。顶点编号为 1,2,…,N。对于每个 i(1≤i≤M),第 i 条有向边从顶点 xi​ 指向顶点 yi​。G 不包含有向环。

请你求出 G 中所有有向路径中最长的那条路径的长度。这里,有向路径的长度指的是该路径上包含的边的数量。

输入格式

输入以如下格式从标准输入读入。

N M
x1​ y1​
x2​ y2​

xM​ yM​

输出格式

输出 G 中所有有向路径中最长的那条路径的长度。

显示翻译

题意翻译

输入输出样例

输入 #1复制

4 5
1 2
1 3
3 2
2 4
3 4

输出 #1复制

3

输入 #2复制

6 3
2 3
4 5
5 6

输出 #2复制

2

输入 #3复制

5 8
5 3
2 3
2 4
5 2
5 1
1 4
4 3
1 3

输出 #3复制

3

说明/提示

限制条件

  • 所有输入均为整数。
  • 2≤N≤105
  • 1≤M≤105
  • 1≤xi​,yi​≤N
  • 所有的 (xi​,yi​) 均互不相同。
  • G 不包含有向环。

样例解释 1

下图中红色的有向路径是最长的。

样例解释 2

下图中红色的有向路径是最长的。

样例解释 3

例如,下图中红色的有向路径是最长的。

由 ChatGPT 4.1 翻译

思路

树形DP。

代码见下

#include<bits/stdc++.h>
using namespace std;
int n,m,vv,u,lk=1,f[100005],fh[100005],ff[100005];
vector<int> v[100005];
inline void abc(int a1){
    ff[a1]=1e9+7;
    //cout<<f[a1]<<endl;
    fh[a1]=1;
    for(int i=0;i<v[a1].size();i++){
        int tt=v[a1][i];
        if(ff[tt]==0){
            abc(tt);   
        }
        fh[a1]=max(fh[a1],fh[tt]+1);
    }
    lk=max(lk,fh[a1]);
    return ;
}
int main(){
	cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>u>>vv;
        //ff[vv]++;
        v[u].push_back(vv);
    }
    for(int i=1;i<=n;i++){
        //cout<<ff[i]<<endl;
        if(ff[i]==0){
            f[i]=1;
            abc(i);
        }
    }
    cout<<lk-1<<endl;
	return 0;
}

posted @ 2025-10-22 21:02  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源