题面
每个点的答案等于 max(它的前驱节点答案+1)
具体实现:邻接表存储+拓扑排序+dp处理
不过貌似CCF数据过水,没有dp处理也可以过 ???
code
#include<bits/stdc++.h>
using namespace std;
int n,m,f[100005],ru[100005];
int cnt,fro[100005],nxt[200005],to[200005];
queue<int>q;
inline int read() {
int x=0; char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x;
}
void add(int x,int y) {
to[++cnt]=y; nxt[cnt]=fro[x]; fro[x]=cnt;
}
int main() {
n=read(); m=read();
for(int i=1;i<=m;i++) {
int x=read(),y=read();
add(x,y); ru[y]++;
}
for(int i=1;i<=n;i++)
if(ru[i]==0) {q.push(i); f[i]=1;}
while(!q.empty()) {
int x=q.front(); q.pop();
for(int i=fro[x];i!=0;i=nxt[i]) {
f[to[i]]=max(f[to[i]],f[x]+1);
if(--ru[to[i]]==0) q.push(to[i]);
}
}
for(int i=1;i<=n;i++)
for(int j=fro[i];j!=0;j=nxt[j])
f[to[j]]=max(f[to[j]],f[i]+1);
for(int i=1;i<=n;i++) printf("%d\n",f[i]);
return 0;
}