6pts 求助
查看原帖
6pts 求助
398152
MinimumSpanningTree最小生成树楼主2024/4/13 16:19

AC on 1#,其他 WA。

#include<iostream>
#include<cstdio>
using namespace std;
const int N=5e4+100,LG=30,M=1e5+100;
int n,m,t[N],k,deep[N],st[N][LG],x[M],y[M],lg[N],c[N],b[N],ma;
bool flag[N]; 
struct node
{
	int id,last;
}a[M*2];
void add(int a1,int a2)
{
	a[++k].id=a2; 
	a[k].last=t[a1];
	t[a1]=k;
}
void dfs(int dx,int fa)
{
	deep[dx]=deep[fa]+1;
	st[dx][0]=fa;
	for(int i=t[dx];i;i=a[i].last)
	{
		if(a[i].id!=fa&&!deep[a[i].id]) dfs(a[i].id,dx);
	}
}
int lca(int dx,int dy)
{
	if(deep[dx]<deep[dy]) swap(dx,dy);
	for(int i=lg[n];i>=0;i--)
	{
		if(deep[st[dx][i]]>=deep[dy]) dx=st[dx][i]; 
		if(dx==dy) return dx;
	}
	for(int i=lg[n];i>=0;i--)
	{
		if(st[dx][i]!=st[dy][i]) dx=st[dx][i],dy=st[dy][i];
	} 
	return st[dx][0];
}
void update(int dx,int dy)
{
	 c[dx]++,c[dy]++;
	 c[lca(dx,dy)]--,c[st[lca(dx,dy)][0]]--;
}
void ans(int dx)
{
	flag[dx]=true;
	b[dx]=c[dx];
	for(int i=t[dx];i;i=a[i].last)
	{
		if(a[i].id!=st[dx][0]&&!flag[a[i].id]) 
		{
			ans(a[i].id);
			b[dx]+=b[a[i].id];
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x[i],&y[i]);
		add(x[i],y[i]);
		add(y[i],x[i]);
	}
	dfs(1,0);
	for(int i=1;i<=lg[n];i++)
	{
		for(int j=1;j<=n;j++) st[j][i]=st[st[j][i-1]][i-1];
	}
	for(int i=1;i<=m;i++) update(x[i],y[i]);
	ans(1);
	for(int i=1;i<=n;i++) ma=max(ma,b[i]);
	printf("%d",ma);
	return 0;
}
2024/4/13 16:19
加载中...