正题
题目链接:https://www.luogu.org/problemnew/show/P1137
题目大意
一张有向无环图,求以每个点为终点的最长路径。
解题思路
先拓扑排序,然后dpdpdp
fy=max{fx+1}(x−>y)f_y=max\{f_x+1\}(x->y)fy=max{fx+1}(x−>y)
codecodecode
#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();
}