洛谷 P1137 旅行计划(拓扑排序)

题目链接: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\n",dp[i]);
54     return 0;
55 }
AC代码

 

posted @ 2020-07-05 20:44  dfydn  阅读(189)  评论(0编辑  收藏  举报