tarjan卡成60分?
查看原帖
tarjan卡成60分?
264463
添哥楼主2023/6/25 18:46

#20~22,#26,#31~33 TLE

#28 WA?

#include<iostream>
#include<string.h>
using namespace std;
int n;
int map[3005][3005];
int x[3005],y[3005];
int dfn[3005],low[3005],color[3005],cnt=0,tot=0;
int v[3005],f[3005];
int sta[3005],top=0;
bool pd[3005];
void tarjan(int now)
{
	cnt++;
	dfn[now]=low[now]=cnt;
	top++;
	sta[top]=now;
	pd[now]=true;
	for(int i=1;i<=map[now][0];i++)
	{
		if(!dfn[map[now][i]])
		{
			tarjan(map[now][i]);
			low[now]=min(low[now],low[map[now][i]]);
		}
		else if(pd[map[now][i]])
		{
			low[now]=min(low[now],dfn[map[now][i]]);
		}
	}
	if(dfn[now]==low[now])
	{
		tot++;
		do
		{
			pd[sta[top]]=false;
			color[sta[top]]=tot;
			v[tot]++;
			top--;
		}
		while(sta[top+1]!=now);
	}
}
int dfs(int now)
{
	if(f[now])
	{
		return f[now];
	}
	int ans=0;
	for(int i=1;i<=map[now][0];i++)
	{
		ans=max(ans,dfs(map[now][i]));
	}
	f[now]=ans+v[now];
	return f[now];
}
int main()
{
	int t,id;
	cin>>t>>id;
	while(t--)
	{
		cnt=tot=top=0;
		memset(map,0,sizeof(map));
		memset(dfn,0,sizeof(dfn));
		memset(low,0,sizeof(low));
		memset(color,0,sizeof(color));
		memset(f,0,sizeof(f));
		memset(v,0,sizeof(v));
		int d,c;
		cin>>n>>d>>c;
		for(int i=1;i<=n;i++)
		{
			cin>>x[i]>>y[i];
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(y[i]+d-y[j]>=max(x[i]-x[j],x[j]-x[i])&&i!=j)
				{
					map[i][0]++;
					map[i][map[i][0]]=j;
				}
			}
		}
		for(int i=1;i<=n;i++)
		{
			if(!dfn[i])
			{
				tarjan(i);
			}
		}
		memset(map,0,sizeof(map));
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				if(y[i]+d-y[j]>=max(x[i]-x[j],x[j]-x[i])&&i!=j)
				{
					if(color[i]!=color[j])
					{
						map[color[i]][0]++;
						map[color[i]][map[color[i]][0]]=color[j];
					}
				}
			}
		}
		cout<<dfs(color[c])<<endl;
	}
	return 0;
}
2023/6/25 18:46
加载中...