社区讨论

关于MLE的问题

P2986[USACO10MAR] Great Cow Gathering G参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@m1qdlhuq
此快照首次捕获于
2024/10/01 19:49
去年
此快照最后确认于
2025/11/04 18:22
4 个月前
查看原帖
为什么数组开小了MLE,数组开大了就不会?
MLE code:
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
ll a[10005],siz[10005];
struct edge{
	int v,w;
};
vector<edge> e[10005];

ll f[10005];
ll ans=LLONG_MAX;
void dfs(int u,int fa)
{
	siz[u]=a[u];
	for(int i=0;i<e[u].size();i++)
	{
		int v=e[u][i].v;
		if(v==fa) continue;
		dfs(v,u);
		siz[u]+=siz[v];
		f[u]+=siz[v]*e[u][i].w+f[v];
	}
}
void dfs2(int u,int fa)
{
	ans=min(ans,f[u]);
	
	for(int i=0;i<e[u].size();i++)
	{
		int v=e[u][i].v;
		if(v==fa)
			continue;
		f[v]=f[u]-siz[v]*e[u][i].w+(siz[1]-siz[v])*e[u][i].w;
		dfs2(v,u);
	}
	
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	for(int i=1;i<n;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		e[u].push_back((edge){v,w});
		e[v].push_back((edge){u,w});
	}
	dfs(1,0);
	dfs2(1,0);
	printf("%lld",ans);
	
	return 0;
}

AC code:

```cpp
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
ll a[100005],siz[100005];
struct edge{
	int v,w;
};
vector<edge> e[100005];

ll f[100005];
ll ans=LLONG_MAX;
void dfs(int u,int fa)
{
	siz[u]=a[u];
	for(int i=0;i<e[u].size();i++)
	{
		int v=e[u][i].v;
		if(v==fa) continue;
		dfs(v,u);
		siz[u]+=siz[v];
		f[u]+=siz[v]*e[u][i].w+f[v];
	}
}
void dfs2(int u,int fa)
{
	ans=min(ans,f[u]);
	
	for(int i=0;i<e[u].size();i++)
	{
		int v=e[u][i].v;
		if(v==fa)
			continue;
		f[v]=f[u]-siz[v]*e[u][i].w+(siz[1]-siz[v])*e[u][i].w;
		dfs2(v,u);
	}
	
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	for(int i=1;i<n;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		e[u].push_back((edge){v,w});
		e[v].push_back((edge){u,w});
	}
	dfs(1,0);
	dfs2(1,0);
	printf("%lld",ans);
	
	return 0;
}

回复

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

正在加载回复...