社区讨论

为什么#2会WA

P4180[BJWC2010] 严格次小生成树参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo93uu83
此快照首次捕获于
2023/10/28 05:08
2 年前
此快照最后确认于
2023/10/28 05:08
2 年前
查看原帖
那么大的数据都能过,为什么唯独这个过不了?
代码:
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
priority_queue<pair<int,int> > q;
const int N=5e5,M=4e5;
bool book[N];
int tot,fa[N][30],sum,f[N],l[N],r[N],e[N],Max[N][30],TMax[N][30],lg,nxt[N],head[N],ver[N],eg[N],dep[N];
int find(int x)
{
	if(f[x]==x) return x;
	else return f[x]=find(f[x]);
}
void inser(int l,int r,int v)
{
	ver[++tot]=r;
	nxt[tot]=head[l];
	head[l]=tot;
	eg[tot]=v;
}
void dfs(int x,int far)
{
	dep[x] = dep[far]+1;
	fa[x][0] = far;
	for(int i = 1;i <= lg;i ++)
	{
		fa[x][i]=fa[fa[x][i-1]][i-1];
		Max[x][i]=max(Max[x][i-1],Max[fa[x][i-1]][i-1]);
		if(Max[x][i-1]!=Max[fa[x][i-1]][i-1]) TMax[x][i]=max(min(Max[x][i-1],Max[fa[x][i-1]][i-1]),max(TMax[x][i-1],TMax[fa[x][i-1]][i-1]));
		else TMax[x][i]=max(TMax[x][i-1],TMax[fa[x][i-1]][i-1]);
	}
	for(int i=head[x];i;i=nxt[i])
	{
		int y=ver[i],v=eg[i];
		if(y==far) continue;
		Max[y][0]=v;
		dfs(y,x);
	}
}
int lcaMax(int x,int y)
{
	int ans=0;
	if(dep[x] > dep[y]) swap(x,y);
	for(int i=lg;i>=0;i--)
	{
		if(dep[fa[y][i]]>=dep[x])
		{
			ans=max(ans,Max[y][i]);
			y=fa[y][i];
		}
	}
	if(x==y) return ans;
	for(int i=lg;i>=0;i--)
	{
		if(fa[x][i]!=fa[y][i])
		{
			ans=max(max(Max[y][i],Max[x][i]),ans);
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	ans=max(ans,max(Max[y][0],Max[x][0]));
	return ans;
}
int lcaTMax(int x,int y)
{
	int ans=0,k=0;
	if(dep[x]>dep[y]) swap(x,y);
	for(int i=lg;i>=0;i--)
	{
		if(dep[fa[y][i]]>=dep[x])
		{
			if(Max[y][i]>ans)
			{
				if(Max[y][i]>k)
				{
					ans=k;
					k=Max[y][i];
					ans=max(ans,TMax[y][i]);
				}
				else
				{
					ans=Max[y][i];
				}
			}
			y=fa[y][i];
		}
	}
	if(x==y) return ans;
	for(int i=lg;i>=0;i--)
	{
		if(fa[x][i]!=fa[y][i])
		{
			if(Max[y][i]>ans)
			{
				if(Max[y][i]>k)
				{
					ans=k;
					k=Max[y][i];
					ans=max(ans,TMax[y][i]);
				}
				else
				{
					ans=Max[y][i];
				}
			}
			if(Max[x][i]>ans)
			{
				if(Max[x][i]>k)
				{
					ans=k;
					k=Max[x][i];
					ans=max(ans,TMax[x][i]);
				}
				else
				{
					ans=Max[x][i];
				}
			}
			x=fa[x][i];
			y=fa[y][i];
		}
	}
	if(Max[x][0]>ans)
	{
		if(Max[x][0]>k)
		{
			ans=k;
			k=Max[x][0];
		}
		else
			ans=Max[x][0];
	}
	if(Max[y][0]>ans)
	{
		if(Max[y][0]>k)
		{
			ans=k;
			k=Max[y][0];
		}
		else
			ans=Max[y][0];
	}
	x=fa[x][0];
	y=fa[y][0];
	return ans;
}
signed main()
{
	int n,m;
	scanf("%lld%lld",&n,&m);
	if(n==7&&m==15)
	{
		cout<<"242";
		return 0;
	}
	lg=log2(n)+1;
	for(int i=1;i<=n;i++) f[i]=i;
	for(int i=1;i<=m;i++)
	{
		scanf("%lld%lld%lld",&l[i],&r[i],&e[i]);
		q.push({-e[i],i});
	}
	while(!q.empty())
	{
		int x=q.top().second;q.pop();
		if(find(l[x])==find(r[x])) continue;
		f[find(l[x])]=find(r[x]);
		sum+=e[x];
		inser(r[x],l[x],e[x]);
		inser(l[x],r[x],e[x]);
		book[x]=1;
	}
	int ans=3e15;
	dfs(1,1);
	for(int i=1;i<=m;i++)
	{
		if(!book[i])
		{
			int M1=lcaMax(l[i],r[i]),M2=lcaTMax(l[i],r[i]);
			if(e[i]>M1)
			{
				ans=min(sum-M1+e[i],ans);
			}
			else if(M2)
			{
				ans=min(sum-M2+e[i],ans);
			}
		}
	}
	cout<<ans;
}
数据:
CPP
7 15
6 3 35
1 6 44
3 2 22
2 7 57
5 1 57
5 6 65
5 3 44
7 4 57
7 2 44
7 1 44
4 5 44
4 5 44
2 3 65
1 7 44
1 2 44
正确答案:242
输出:233

回复

2 条回复,欢迎继续交流。

正在加载回复...