正题
题目链接:https://www.luogu.org/problemnew/show/P1137
题目大意
一张有向无环图,求以每个点为终点的最长路径。
解题思路
先拓扑排序,然后
d
p
dp
dp
f
y
=
m
a
x
{
f
x
+
1
}
(
x
−
>
y
)
f_y=max\{f_x+1\}(x->y)
fy=max{fx+1}(x−>y)
c o d e code code
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int maxv=110000,maxe=210000;
struct rec{
int x,y,next;
}a[maxe];
int n,e;
int ls[maxv],in[maxv],list[maxv],f[maxv];
queue<int>q;
void init()
{
scanf("%d%d",&n,&e);
memset(ls,0,sizeof(ls));
for(int i=1;i<=e;i++){
scanf("%d%d",&a[i].x,&a[i].y);
a[i].next=ls[a[i].x];
ls[a[i].x]=i;
}
}
void topsort(){
int cnt=0;
memset(in,0,sizeof(in));
for(int i=1;i<=e;i++)
in[a[i].y]++;
for(int i=1;i<=n;i++)
if(!in[i])
q.push(i);
while(!q.empty()){
int x=q.front();q.pop();
list[++cnt]=x;
for(int i=ls[x];i;i=a[i].next){
int y=a[i].y;
in[y]--;
if(!in[y])
q.push(y);
}
}
}
void dp()
{
for(int i=1;i<=n;i++)
{
int x=list[i];
for(int i=ls[x];i;i=a[i].next){
int y=a[i].y;
f[y]=max(f[x]+1,f[y]);
}
}
}
void print(){
for(int i=1;i<=n;i++)
printf("%d\n",f[i]+1);
}
int main()
{
init();
topsort();
dp();
print();
}