最开始拿到这一道题,感觉是树的结构,但是仔细推了一次样例之后,发现这是个图论,因为样例中的某些节点有子节点,但是和其他父节点连在一起,但是思路应该和树差不多,还是先用vector建图
建完图后,会发现一个城市的答案肯定与连接他的城市有关,这样的话就想到了DP(然后我DP很菜)。对于城市x,显然初始值有 f [ x ] = 1,那么状态转移方程就应该为 f [ x ] = max ( f[x] , dp(a [ x ] [ i ]) ),其中 a [ x ] [ i ] 为连接x的城市。这样这道题的代码就很好写了
#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int> a[200005];
int f[200005];
int dp(int x){
if(f[x]!=-1) return f[x];
f[x]=1;
for(register int i=0;i<a[x].size();i++){
f[x]=max(f[x],dp(a[x][i])+1);
}
return f[x];
}
int main(){
scanf("%d%d",&n,&m);
fill(f+1,f+1+n,-1);
for(register int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
a[y].push_back(x);
}
for(register int i=1;i<=n;i++){
printf("%d
",dp(i));
}
return 0;
}