缩点,10pts,求调
查看原帖
缩点,10pts,求调
848964
hzoi_Shadow楼主2023/7/13 20:50
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define sort stable_sort 
#define endl '\n'
struct node
{
	int next,to;
}e[100001];
stack<int>s;
int head[100001],dfn[100001],low[100001],ins[100001],scc[100001],c[100001],u[100001],v[100001],cnt=0,tot=0,ans=0;
void add(int u,int v)
{
	cnt++;
	e[cnt].next=head[u];
	e[cnt].to=v;
	head[u]=cnt;
}
void tarjan(int x)
{
    int i,k=0;
    tot++;
    dfn[x]=low[x]=tot;
    ins[x]=1;
    s.push(x);
    for(i=head[x];i!=0;i=e[i].next)
    {
        if(dfn[e[i].to]==0)
        {
            tarjan(e[i].to);
            low[x]=min(low[x],low[e[i].to]);
        }
        else
        {
            if(ins[e[i].to]==1)
            {
                low[x]=min(low[x],dfn[e[i].to]);
            }
        }
    }
    if(dfn[x]==low[x])
    {
        ans++;
        while(x!=k)
        {
            k=s.top();
            ins[k]=0;
            c[k]=ans;
			scc[ans]++;
            s.pop();
        }
    }
}
int main()
{
    int n,i,j,sum;
    cin>>n;
    for(i=1;i<=n;i++)
    {
		u[i]=i;
        cin>>v[i];
        add(u[i],v[i]);
    }
    for(i=1;i<=n;i++)
    {
        if(dfn[i]==0)
        {
            tarjan(i);
        }
    }
    cnt=0;
    memset(e,0,sizeof(e));
    memset(head,0,sizeof(head));
    for(i=1;i<=n;i++)
    {
        if(c[u[i]]!=c[v[i]])
        {
            add(c[u[i]],c[v[i]]);
        }
    }
	for(i=1;i<=n;i++)
	{
		if(u[i]==v[i])
		{
			cout<<"1"<<endl;
		}
		else
		{
			if(scc[c[u[i]]]==1)
			{
				sum=1;
				for(j=head[c[u[i]]];j!=0;j=e[j].next)
				{
					if(scc[c[e[j].to]]==1)
					{
						sum++;
					}
					else
					{
						sum+=scc[c[e[j].to]];
						break;
					}
				}
				cout<<sum<<endl;
			}
			else
			{
				cout<<scc[c[u[i]]]<<endl;
			}
		}
	}
    return 0;
}
2023/7/13 20:50
加载中...