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;
}

浙公网安备 33010602011771号