我感觉和他们纯dp的差不多啊
就是没有初始化,虽然不太懂为啥要
就是反向建,然后dp[i]=max(dp[i],dp[p[i][j]]+1)
j from 0 to p[i].size()-1
#include<bits/stdc++.h>
#define Max 100006
using namespace std;
int n,m,a,b,dp[Max];
vector<int> q[Max];
inline int read(){
char ch=getchar();
int x=0,f=1;
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+(ch^48);
ch=getchar();
}
return x*f;
}
int main(){
n=read(),m=read();
for(int i=1;i<=m;i++){
a=read(),b=read();
q[b].push_back(a);
}
for(int i=1;i<=n;i++){
dp[i]=1;
for(int j=0;j<q[i].size();j++)dp[i]=max(dp[i],dp[q[i][j]]+1);
cout<<dp[i]<<endl;
}
return 0;
}