社区讨论

20pts,听取TLE声一片,有什么优化方法吗

P14080[GESP202509 八级] 最小生成树参与者 3已保存回复 6

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@mm76kau2
此快照首次捕获于
2026/03/01 11:18
上周
此快照最后确认于
2026/03/03 19:35
上周
查看原帖
rt
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10,maxm=1e5+10;
int fa[maxn];
int get(int x)
{
	if(x==fa[x])return x;
	return fa[x]=get(fa[x]);
}
void _merge_(int x,int y)
{
	int rx=get(x),ry=get(y);
	if(rx==ry)return;
	fa[rx]=ry;
}
struct tree
{
	int u;
	int v;
	int w;
}a[maxm];
struct tree2
{
	int u;
	int v;
	int w;
}b[maxm];
bool cmp(tree x,tree y)
{
	return x.w<y.w;
}
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>a[i].u>>a[i].v>>a[i].w;
		b[i].u=a[i].u,b[i].v=a[i].v,b[i].w=a[i].w;
	}
	for(int i=1;i<=n;i++)fa[i]=i;
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=m;i++)
	{
		long long ans=0;
		for(int j=1;j<=n;j++)fa[j]=j;
		for(int j=1;j<=m;j++)
		{
			if(b[i].u==a[j].u&&b[i].v==a[j].v&&b[i].w==a[j].w)continue;
			if(get(a[j].u)!=get(a[j].v))
			{
				_merge_(a[j].u,a[j].v);
				ans+=a[j].w;
			}
		}
		int cnt=0;
		for(int j=1;j<=n;j++)
		{
			if(get(j)==j)
			{
				cnt++;
			}
		}
		if(cnt==1)cout<<ans<<"\n";
		else cout<<-1<<"\n";
	}
	return 0;
}

回复

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

正在加载回复...