题目链接:https://www.luogu.com.cn/problem/P1137
拓扑排序+DAG上的DP,用拓扑将图变成线性的拓扑序,然后DP求最长路即可。
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 const int N=100015; 7 queue<int> q; 8 struct node{ 9 int to,next; 10 }edge[N<<1]; 11 int n,m; 12 int head[N],in[N],tot,cnt,ans[N],dp[N]; 13 void init(){ 14 memset(head,-1,sizeof(head)); 15 } 16 void add(int u,int v){ 17 edge[tot].to=v; 18 edge[tot].next=head[u]; 19 head[u]=tot++; 20 } 21 void toposort(){ 22 for(int i=1;i<=n;i++){ 23 if(in[i]==0) q.push(i); 24 } 25 while(!q.empty()){ 26 int u=q.front();q.pop(); 27 ans[++cnt]=u; 28 for(int j=head[u];j!=-1;j=edge[j].next){ 29 int v=edge[j].to; 30 in[v]--; 31 if(in[v]==0) q.push(v); 32 } 33 } 34 } 35 int main(){ 36 init(); 37 scanf("%d%d",&n,&m); 38 for(int i=1;i<=m;i++){ 39 int x,y; 40 scanf("%d%d",&x,&y); 41 add(x,y); 42 in[y]++; 43 } 44 toposort(); 45 for(int i=1;i<=n;i++) dp[i]=1; 46 for(int i=1;i<=n;i++){ 47 int u=ans[i]; 48 for(int j=head[u];j!=-1;j=edge[j].next){ 49 int v=edge[j].to; 50 dp[v]=max(dp[v],dp[u]+1); 51 } 52 } 53 for(int i=1;i<=n;i++) printf("%d ",dp[i]); 54 return 0; 55 }