求助大佬
查看原帖
求助大佬
873786
wangjiajinself楼主2024/3/9 17:19

枚举删除最小生成树上的每条边,再求最小生成树 就是不要求满分但是为什么4个RE9个MLE啊啊啊(疯了)

#include <iostream>
#include <algorithm>
#include <limits.h>
using namespace std;
const int N=1e5+1,M=3e5+1;
int n,m,x,y,z,cnt=0,f[N],ope[M],sum=0,p=0;
long long ansf,ans=-3;
struct Edge{
	int s,e,w;
}e[M];
bool cmp(Edge o,Edge p)
{
	return o.w<p.w;
}
void add(int x,int y,int z)
{
	e[++cnt].s=x;
	e[cnt].e=y;
	e[cnt].w=z;
}
int find(int i)
{
	if(f[i]!=i) f[i]=find(f[i]);
	return f[i];
}
void kruscal()
{
	for(int i=1;i<=n;i++) f[i]=i;
	for(int i=1;i<=m;i++)
	{
		if(find(e[i].s)!=find(e[i].e))
		{
			 ope[++sum]=i;
			 f[find(e[i].s)]=find(e[i].e);
		}
		if(sum==m-1) return;
	}
}
void skruscal(int u)
{
	ansf=0,p=0;
	for(int i=1;i<=n;i++) f[i]=i;
	for(int i=1;i<=m;i++)
	{
		if(i==u) continue;
		if(find(e[i].s)!=find(e[i].e))
		{
			ope[++sum]=i;
			f[find(e[i].s)]=find(e[i].e);
			ansf+=e[i].w;
			p++;
		}
		if(p==m-1) break;//
	}
	ans=max(ansf,ans);
}
int main() {
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y>>z;
		add(x,y,z);
	}
	sort(e+1,e+m+1,cmp);
	kruscal();
	for(int i=1;i<=sum;i++)
	skruscal(ope[i]);
	cout<<ans;
	return 0;
}
2024/3/9 17:19
加载中...