调了那么久就是因为
pro=max(pro,sec(ans1,fmax[u][0],fmax[v][0]));//shunxu!!!
ans1=max(ans1,max(fmax[u][0],fmax[v][0]));
ans2=max(ans2,max(smax[u][0],smax[v][0]));
ans2=max(pro,ans2);
最后一步pro的语序错了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const int M=300000+5,N=100000+5,P=16;
int fa[N],nxt[M],to[M],head[N],w[M],etot;
bool exi[M];
int fmax[N][P+1],smax[N][P+1],anc[N][P+1],dep[N];
struct edge{
int u,v,w;
}e[M];
int sec(int a,int b,int c){
if((a<=b&&a>=c)||(a>=b&&a<=c)) return a;
if((b<=c&&b>=a)||(b<=a&&b>=c)) return b;
if((c<=a&&c>=b)||(c<=b&&c>=a)) return c;
}
void adde(int u,int v,int c){
to[++etot]=v;
w[etot]=c;
nxt[etot]=head[u];
head[u]=etot;
}
int cmp(edge a,edge b){
return a.w<b.w;
}
int getfa(int x){
return fa[x]==x?x:fa[x]=getfa(fa[x]);
}
void merge(int u,int v){
int pa=getfa(u),pb=getfa(v);
fa[pa]=pb;
}
void dfs(int u,int fa)
{
dep[u]=dep[fa]+1;
anc[u][0]=fa;
for(int p=1;p<=P;p++){
anc[u][p]=anc[anc[u][p-1]][p-1];
fmax[u][p]=max(fmax[u][p-1],fmax[anc[u][p-1]][p-1]);
smax[u][p]=max(max(smax[u][p-1],smax[anc[u][p-1]][p-1]),min(fmax[u][p-1],fmax[anc[u][p-1]][p-1]));
}
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(v==fa) continue;
fmax[v][0]=w[i];
smax[v][0]=-1;
dfs(v,u);
}
}
void query(int u,int v,int &ans1,int &ans2)
{
int pro=-1;
if(dep[u]<dep[v]) swap(u,v);
int t=dep[u]-dep[v];
for(int p=0;t;t>>=1,p++)
if(t&1){
ans1=max(ans1,fmax[u][p]);
ans2=max(ans2,smax[u][p]);
u=anc[u][p];//shunxu!!
}
if(u==v) return;
for(int p=P;p>=0;p--)
if(anc[u][p]!=anc[v][p]) {
pro=max(pro,sec(ans1,fmax[u][p],fmax[v][p]));
ans1=max(ans1,max(fmax[u][p],fmax[v][p]));
ans2=max(ans2,max(smax[u][p],smax[v][p]));
u=anc[u][p],v=anc[v][p];
}
//沿途再求一个fmax的第二 和smax的第一相比
pro=max(pro,sec(ans1,fmax[u][0],fmax[v][0]));//shunxu!!!
ans1=max(ans1,max(fmax[u][0],fmax[v][0]));
ans2=max(ans2,max(smax[u][0],smax[v][0]));
ans2=max(pro,ans2);
}
int main()
{
int n,m;
int tot=0;ll val=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
sort(e+1,e+1+m,cmp);
for(int i=1;i<=m;i++){
if(getfa(e[i].u)!=getfa(e[i].v)){
adde(e[i].u,e[i].v,e[i].w);
adde(e[i].v,e[i].u,e[i].w);
exi[i]=1;
merge(e[i].u,e[i].v);
val=val+1ll*e[i].w;
if(++tot==n-1) break;
}
}
// printf("val:%I64d\n",val);
dfs(1,1);
int del=1e9;
for(int i=1;i<=m;i++)
if(!exi[i]){
int fans=-1,sans=-1;
query(e[i].u,e[i].v,fans,sans);
if(fans!=e[i].w)
del=min(del,e[i].w-fans);
if(sans!=e[i].w&&sans!=-1)
del=min(del,e[i].w-sans);
}
val=val+del;
printf("%lld",val);//bzoj lld
return 0;
}