zoukankan      html  css  js  c++  java
  • 题解 P1137 【旅行计划】

    传送门

    很显然,每个点的答案是它所有前驱节点的答案加1,即f[i]=max(f[i],f[j]+1); 考虑空间复杂度用邻接表存图,在拓扑排序同时DP就好了

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<map>
    #include<cmath>
    using namespace std;
    int n,m,lin[100010],in[100010],total,f[100010];
    queue<int>q;
    struct cym{
        int to,next;
    }e[400010];
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            e[++total].to=y;
            e[total].next=lin[x];
            lin[x]=total;
            in[y]++;
        }
        for(int i=1;i<=n;i++)
        if(in[i]==0)
        {
            f[i]=1;
            q.push(i);
        }
        while(!q.empty())
        {
            int cnt=q.front();q.pop();
            for(int i=lin[cnt];i;i=e[i].next)
            {
                f[e[i].to]=max(f[e[i].to],f[cnt]+1);
                if(--in[e[i].to]==0)q.push(e[i].to);    
            }   
        }
        for(int i=1;i<=n;i++)printf("%d
    ",f[i]);
    }
  • 相关阅读:
    MidPayinfoVO
    IPayablebillItf
    预算oracle
    oracle怎么查看表字段的类型
    orcale授权
    ORCAL
    【转】Oracle
    其他网站api
    生成pdf入门
    有关一个java项目到eclipse中运行
  • 原文地址:https://www.cnblogs.com/zzh666/p/9005216.html
Copyright © 2011-2022 走看看