P1137 旅行计划

/*拓扑排序去寻找点的拓扑序
便于DP,那么怎么去找
首先邻接表存边,然后dfs搜寻每一个点
最后进行拓扑排序,找到拓扑序*/
#include<bits/stdc++.h>
const int maxn = 100005;
const int maxm = 200005;
using namespace std;
int n,m,p=1;
int a,b;
int dp[maxn];
int h[maxn],v[maxm],zrj[maxm];
void add(int a,int b)
{
    zrj[p]=h[b];
    h[b]=p;
    v[p]=a;
    p++;
}
int dfs(int y,int x)
{
    if (dp[x]) return dp[x];
    for (int j=h[x],u=v[j]; j; j=zrj[j],u=v[j])
    {
        dp[x]=max(dfs(y+1,u)+1,dp[x]);
    }
    return dp[x];
}
int main()
{
    cin>>n>>m;
    for (int i=1; i<=m; i++)
    {
        cin>>a>>b;
        add(a,b);
    }
    for (int i=n; i>=1; i--)
        dfs(1,i);
    for (int i=1; i<=n; i++)
        cout<<dp[i]+1<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/xmex/p/10121592.html