RT,蒟蒻就是修改了一下语法,怎么低这么多分,awsl
#include<bits/stdc++.h>
using namespace std;
using pii=pair<int,int>;
using tiiib=tuple<int,int,int,bool>;
const int N=1e5+1;
vector<pii>G[N];
#define pb push_back
vector<tiiib>e1;
int n,m;
long ans;
void kruskal(){
static int fa[N];
for(int i=1;i<=n;++i) fa[i]=i;
function<int(int)>find=[&](int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
};
#define add(u,v,w) G[u].pb({v,w}),G[v].pb({u,w})
sort(e1.begin(),e1.end());
for(auto&[w,u,v,used]:e1){
int fu=find(u),fv=find(v);
if(fu!=fv) ans+=w,add(u,v,w),used=1,fa[fv]=fu;
}
}
const int L=log2(N-1)+1;
int f[N][L],mx[N][L],mx2[N][L],dep[N];
#define _(x) x[u][i]
#define Ls(x) x[u][i-1]
#define Rs(x) x[f[u][i-1]][i-1]
void dfs(int u){
dep[u]=dep[*f[u]]+1;
for(int i=1;(1<<i)<=n;++i){
_(f)=Rs(f);
if(Ls(mx)==Rs(mx)) _(mx)=Ls(mx),_(mx2)=max(Ls(mx2),Rs(mx2));
else if(Ls(mx)<Rs(mx)) _(mx)=Rs(mx),_(mx2)=max(Ls(mx),Rs(mx2));
else _(mx)=Ls(mx),_(mx2)=max(Ls(mx2),Rs(mx));
}
for(auto[v,w]:G[u])
if(v!=*f[u]) *f[v]=u,*mx[v]=w,dfs(v);
}
const long inf=0x7fffffffffffffff;
long cal(int u,int v,int w){
#define irep for(int i=log2(n);~i;--i)
auto LCA=[&](int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(int x=dep[u]-dep[v],n;x;)
n=log2(x),u=f[u][n],x^=1<<n;
if(u==v) return v;
irep if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
return *f[u];
};
int l=LCA(u,v),nmx=0,nmx2=0;
#define opt(u)\
if(dep[_(f)]>=dep[l]){\
if(nmx==_(mx)) nmx2=max(_(mx2),nmx2);\
else if(nmx>_(mx)) nmx2=max(_(mx),nmx2);\
else nmx2=max(_(mx2),nmx),nmx=_(mx);\
u=f[u][i];\
}
irep {opt(u) opt(v)}
if(w!=nmx) return ans-nmx+w;
if(nmx2) return ans-nmx2+w;
return inf;
}
#undef opt
#undef add
#undef irep
#undef pb
#undef _
#undef Ls
#undef Rs
main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n>>m,e1.resize(m);
for(auto&[w,u,v,used]:e1)
cin>>u>>v>>w,used=0;
kruskal(),dfs(1);
long ans=inf;
for(auto[w,u,v,used]:e1)
if(!used) ans=min(cal(u,v,w),ans);
cout<<ans;
}
#include<bits/stdc++.h>
using namespace std;
using pii=pair<int,int>;
using tiiib=tuple<int,int,int,bool>;
const int N=1e5+1;
vector<pii>G[N];
#define pb push_back
void add(int u,int v,int w){
G[u].pb({v,w}),G[v].pb({u,w});
}
vector<tiiib>e1;
int fa[N];
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
long ans;
void kruskal(){
sort(e1.begin(),e1.end());
for(auto&[w,u,v,used]:e1){
int fu=find(u),fv=find(v);
if(fu!=fv) ans+=w,add(u,v,w),used=1,fa[fv]=fu;
}
}
const int L=log2(N-1)+1;
int n,m,f[N][L],mx[N][L],mx2[N][L],dep[N];
/*inline void Ls(int(*Max)[L],int u,int i){
return Max[u][i-1];
}
inline void Rs(int(*Max)[L],int u,int i){
return Max[f[u][i-1]][i-1];
}*/
#define _(x) x[u][i]
#define Ls(x) x[u][i-1]
#define Rs(x) x[f[u][i-1]][i-1]
void dfs(int u){
dep[u]=dep[*f[u]]+1;
for(int i=1;(1<<i)<=n;++i){
_(f)=Rs(f);
if(Ls(mx)==Rs(mx)) _(mx)=Ls(mx),_(mx2)=max(Ls(mx2),Rs(mx2));
else if(Ls(mx)<Rs(mx)) _(mx)=Rs(mx),_(mx2)=max(Ls(mx),Rs(mx2));
else _(mx)=Ls(mx),_(mx2)=max(Ls(mx2),Rs(mx));
}
for(auto[v,w]:G[u])
if(v!=*f[u]) *f[v]=u,*mx[v]=w,dfs(v);
}
#define irep for(int i=log2(n);~i;--i)
int LCA(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(int x=dep[u]-dep[v],n;x;x-=1<<n)
n=log2(x),u=f[u][n];
if(u==v) return v;
irep if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
return *f[u];
}
const long inf=0x7fffffffffffffff;
long cal(int u,int v,int w){
int l=LCA(u,v),nmx=0,nmx2=0;
function<void(int&,int)> opt=[&](int&u,int i){
if(dep[_(f)]>=dep[l]){
if(nmx==_(mx)) nmx2=max(_(mx2),nmx2);
else if(nmx>_(mx)) nmx2=max(_(mx),nmx2);
else nmx2=max(_(mx2),nmx),nmx=_(mx);
u=f[u][i];
}
};
irep opt(u,i),opt(v,i);
if(w!=nmx) return ans-nmx+w;
if(nmx2) return ans-nmx2+w;
return inf;
}
main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n>>m,e1.resize(m);
for(auto&[w,u,v,used]:e1)
cin>>u>>v>>w,used=0;
for(int i=1;i<=n;++i) fa[i]=i;
kruskal(),dfs(1);
long ans=inf;
for(auto[w,u,v,used]:e1)
if(!used) ans=min(cal(u,v,w),ans);
cout<<ans;
}