MLE,要怎么改进啊,感觉没炸空间啊
查看原帖
MLE,要怎么改进啊,感觉没炸空间啊
675572
syyyyhy楼主2022/3/27 15:09
#include <bits/stdc++.h>
using namespace std;
int ans[100006];
int num[100006];
int low[100006];
int dfn[100006];
int entry[100006];
vector<int> stake;
int time2=1;
int tarjan(int number)
{
	low[number]=time2;
	dfn[number]=time2;
	time2++;
	if(!dfn[num[number]])
	{
		entry[num[number]]=1;
		stake.push_back(num[number]);
		tarjan(num[number]);
		low[number]=min(low[number],low[num[number]]);
	}
	if(entry[number])
	{
		low[number]=min(low[number],low[num[number]]);
	}
	
	if(low[number]==dfn[number])
	{
		entry[number]=1;
		if(stake[stake.size()-1]==number)
		{
			stake.pop_back();
		}
		else
		{
			int k;
			int first=0;
			int sum=stake.size();
			for(int i=0;i<stake.size();i++)
			{
				if(stake[i]==number)
				{
					k=i;
					break;
				}
			}
			
			while(stake[stake.size()-1]!=number)
			{
				first=stake[stake.size()-1];
				ans[first]=sum-k;
				stake.pop_back();
			}
			first=stake[stake.size()-1];
			ans[first]=sum-k;
			stake.pop_back();
		}
	}
}

int dfs(int number)
{
	if(ans[number])
	{
		return ans[number];  //如果本身就是个环 
	}
	int count2=1;
	if(ans[num[number]])
	{
		return count2+ans[num[number]];
	}
	else
	{
		count2+=dfs(num[number]);
	}
	return count2;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>num[i];
		if(num[i]==i)
		{
			ans[i]=1; //是一个自环 
		}
	}
	
	for(int i=1;i<=n;i++)
	{
		if(!ans[i]&&!dfn[i])
		{
			entry[i]=1;
			stake.push_back(i);
			tarjan(i);
		}
	}
	
	for(int i=1;i<=n;i++)
	{
		ans[i]=dfs(i);
		cout<<ans[i]<<endl;
	}
}
2022/3/27 15:09
加载中...