TLE 94 求助
查看原帖
TLE 94 求助
1124889
W_ater楼主2025/7/1 14:37

第11个点TLE

#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
struct EDGE{
	int ne,to;
}e[1000006],ee[1000006];
int s[100005];
int si[100005];
int dfn[200005];
int low[200005];
int stc[200005];
int bel[100005];
int hea[200005];
int head[100005];
bool vis[100005];
bool cut[100005];
	int n,m,a,b;
int sum=1,su=1,sumc=0,ti=0,top=0,r;
vector<int> p[100005];
void add(int x,int y)
{
	sum++;
	e[sum].to=y;
	e[sum].ne=head[x];
	head[x]=sum;
}
void ad(int x,int y)
{
	su++;
	ee[su].to=y;
	ee[su].ne=hea[x];
	hea[x]=su;
	s[x]++;
}
void tarjan(int x)
{
	++ti;
	low[x]=dfn[x]=ti;
	stc[++top]=x;
	for(int i=head[x];i;i=e[i].ne)
	{
		if(!dfn[e[i].to])
		{
			tarjan(e[i].to);
			low[x]=min(low[x],low[e[i].to]);
			if(dfn[x]<=low[e[i].to])
			{
				sumc++;
				while(stc[top+1]!=e[i].to)
				{
					p[stc[top--]].push_back(sumc);
					si[sumc]++;
					
				}
				p[x].push_back(sumc);
				si[sumc]++;
			}
		}
		else
			low[x]=min(low[x],dfn[e[i].to]);
	}
}
int dfs(int x)
{
	int tot=si[x]-s[x];
	if(si[x]==1)
		tot=1;
	vis[x]=1;
	for(int i=hea[x];i;i=ee[i].ne)
	{
		if(ee[i].to!=r&&vis[ee[i].to]==0)
			tot+=dfs(ee[i].to);
	}
	return tot;
}
int main()
{
	long long ans;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&a,&b);
		if(a==b)
			continue;
		add(a,b);
		add(b,a); 
	}
	tarjan(1);
	for(int i=1;i<=n;i++)
	{
		if(p[i].size()>1)
		{
			sumc++;
			bel[i]=sumc;
			si[sumc]=1;
			for(int j=0;j<p[i].size();j++)
			{
				ad(sumc,p[i][j]);
				ad(p[i][j],sumc);
			}
		}
	}
	for(int l=1;l<=n;l++)
	{
		ans=2*(n-1);
		r=bel[l];
		if(p[l].size()==1)
			printf("%lld\n",ans);
		else
		{
			for(int i=1;i<=n;i++)
				vis[i]=0;
			for(int i=0;i<p[l].size();i++)
			{
				int d=dfs(p[l][i]);
				ans+=1ll*d*(n-d-1);
			}
			printf("%lld\n",ans);
		}
	}
}
2025/7/1 14:37
加载中...