LG2921 [USACO2008DEC]Trick or Treat on the Farm 内向基环树

问题描述

LG2921


题解

发现一共有 \(n\) 个点,每个点只有一条出边,即只有 \(n\) 条边,于是就是一个内向基环树。

\(\mathrm{Tarjan}\) 缩点。

但是这个题比较猥琐的就是有自环。

所以断定一个强联通分量 \(i\) 是环的条件是 \(size_i>1\)

然后记搜求答案,特判自环。


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std;

template <typename Tp>
void read(Tp &x){
    x=0;char ch=1;int fh;
    while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
    if(ch=='-') ch=getchar(),fh=-1;
    else fh=1;
    while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    x*=fh;
}

const int maxn=100007;

int n;
int son[maxn],fa[maxn];

int dfn[maxn],low[maxn],ind;
bool ins[maxn];
int sta[maxn],top;

int bel[maxn],cnt;
int size[maxn];
int spe;

void tarjan(int x){
    dfn[x]=low[x]=++ind,ins[x]=1,sta[++top]=x;
    if(dfn[son[x]]){
        if(ins[son[x]]) low[x]=min(low[x],dfn[son[x]]);
    }
    else{
        tarjan(son[x]);
        low[x]=min(low[x],low[son[x]]);
    }
    if(dfn[x]==low[x]){
        ++cnt;
        while(sta[top]!=x){
            bel[sta[top]]=cnt;
            ins[sta[top]]=0;--top;
            ++size[cnt];
        }
        ++size[cnt];
        ins[x]=0,bel[x]=cnt;--top;
    }
}

int ans[maxn];

int dfs(int x){
    if(size[bel[x]]>1) return ans[x]=size[bel[x]];
    if(ans[x]) return ans[x];
    return ans[x]=dfs(son[x])+1;
}

int main(){
    read(n);
    for(int i=1;i<=n;i++){
        read(son[i]);fa[son[i]]=i;
        if(son[i]==i) ans[i]=1;
    }
    for(int i=1;i<=n;i++){
        if(!dfn[i]) tarjan(i);
        if(size[bel[i]]>1) spe=bel[i];
    }
    for(int i=1;i<=n;i++){
        if(!ans[i]) dfs(i);
    }
    for(int i=1;i<=n;i++)
        printf("%d\n",ans[i]);
    return 0;
}
全部评论

相关推荐

05-20 13:59
门头沟学院 Java
米黑子米黑子:你这个成绩不争取下保研?
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 14:46
和女友两个人马上毕业,现在我在鹅实习995,周六日偶尔也去北京;她在北京金融007,经常忙到后半夜,周末也没啥休息机会两个人现在都不咋聊天了,一句话隔半小时甚至半天才回。&nbsp;她是个很优秀的妹子,工作也很努力,是值得学习一辈子的人。我在努力工作求转正,即便不行至少赚到了一段不错的实习经历。已经异地了半年,接下来可能还会持续是这个状态。我们都算是对方重要的人,只是感觉看上去不是很有未来的样子。希望牛友们给点的鼓励
梦旅奇缘:很难。异地首先就已经很难了,加上妹子是金融行业,忙碌高压,对情感需求很高,而且见惯纸醉金迷,你的很多优势在她那里可能就不算什么了。这种情况下,在她们那里遇到一个能及时照顾她的人,即使那人可能很多条件不如你,你也有可能被分手。 说白了,两个卷王就不太适合在一起。因为卷王最大的优势,在另一个卷王那里就不算优势了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务