zoukankan      html  css  js  c++  java
  • 【洛谷P2921】Trick or Treat on the Farm

    题目大意:给定一个 N 个节点的内向树森林,求从每个顶点出发能够到达的最多不重复顶点的个数是多少。

    题解:内向树森林是由一个或若干个环加若干条链构成。可以先按照类似于拓扑排序的规则进行删链,再对环上的点计算答案,最后计算链上的答案即可。

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+10;
    
    int n,to[maxn],ans[maxn],indeg[maxn];
    bool vis[maxn];
    
    void read_and_parse(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&to[i]),++indeg[to[i]];
    }
    
    void del(int u){
        vis[u]=1;
        if(!--indeg[to[u]])del(to[u]);
    }
    
    int cyc(int u,int dep){
        vis[u]=1;
        if(vis[to[u]])return ans[u]=dep;
        else return ans[u]=cyc(to[u],dep+1);
    }
    
    int calc(int u){
        if(ans[u])return ans[u];
        else return ans[u]=calc(to[u])+1;
    }
    
    void solve(){
        for(int i=1;i<=n;i++)if(!indeg[i]&&!vis[i])del(i);
        for(int i=1;i<=n;i++)if(indeg[i]&&!vis[i])cyc(i,1);
        for(int i=1;i<=n;i++)if(!indeg[i]&&!ans[i])calc(i);
        for(int i=1;i<=n;i++)printf("%d
    ",ans[i]);
    }
    
    int main(){
        read_and_parse();
        solve();
        return 0;
    }
    
    
  • 相关阅读:
    网络基础
    Linux安装Redis
    mongodb——文档操作
    mangodb——集合的操作
    Linux安装MongoDB
    2021-10-14软件设计师
    2021-10-13
    How do you use System.Drawing in .NET Core?
    C# 9.0 新特性
    Mysql存储引擎
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10202256.html
Copyright © 2011-2022 走看看