枚举删除最小生成树上的每条边,再求最小生成树 就是不要求满分但是为什么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;
}