各位A了的大佬们,6#错了的都是些什么原因啊,那些hack我的代码跑都是对的
#include<bits/stdc++.h>
using namespace std;
struct node{
long long to,val;
}N;
struct edge{
long long from,to,val;
}ed[300050];
bool cmp(edge A,edge B){
return A.val<B.val;
}
long long n,m,x,y,z,f[100050],k,depth[100050],bz_max[100050][20],bz_min[100050][20],bz[100050][20];
long long ans=2147483647000000000,sum;
bool mst[300050];
vector<node> T[100050],new_T[100050];
long long find(long long x){
if(f[x]==x)return x;
return f[x]=find(f[x]);
}
void merge(long long x,long long y){
f[find(x)]=find(y);
}
long long min(long long X,long long Y){
return X<Y?X:Y;
}
long long find_max(long long X,long long Y){
if(depth[X]<depth[Y])swap(X,Y);
long long ret=-2147483647,tmp;
while(depth[X]>depth[Y]){
tmp=log2(depth[X]-depth[Y]);
ret=max(ret,bz_max[X][tmp]);
X=bz[X][tmp];
}if(X==Y)return ret;
tmp=log2(depth[X]-1);
while(tmp>0){
if(bz[X][tmp]==bz[Y][tmp])tmp--;
else{
ret=max(ret,bz_max[X][tmp]);
ret=max(ret,bz_max[Y][tmp]);
X=bz[X][tmp];
Y=bz[Y][tmp];
}
}ret=max(ret,bz_max[X][0]);
ret=max(ret,bz_max[Y][0]);
return ret;
}
long long find_min(long long X,long long Y){
if(depth[X]<depth[Y])swap(X,Y);
long long ret=-2147483647,tmp,maxn=find_max(X,Y);
while(depth[X]>depth[Y]){
tmp=log2(depth[X]-depth[Y]);
if(bz_max[X][tmp]<maxn)ret=max(ret,bz_max[X][tmp]);
else ret=max(ret,bz_min[X][tmp]);
X=bz[X][tmp];
}if(X==Y)return ret;
tmp=log2(depth[X]-1);
while(tmp>0){
if(bz[X][tmp]==bz[Y][tmp])tmp--;
else{
if(bz_max[X][tmp]<maxn)ret=max(ret,bz_max[X][tmp]);
else ret=max(ret,bz_min[X][tmp]);
if(bz_max[Y][tmp]<maxn)ret=max(ret,bz_max[Y][tmp]);
else ret=max(ret,bz_min[X][tmp]);
X=bz[X][tmp];
Y=bz[Y][tmp];
}
}if(bz_max[X][0]<maxn)ret=max(ret,bz_max[X][0]);
else ret=max(ret,bz_min[X][0]);
if(bz_max[Y][0]<maxn)ret=max(ret,bz_max[Y][0]);
else ret=max(ret,bz_min[Y][0]);
return ret;
}
void dfs(long long no,long long deep){
depth[no]=deep;
for(unsigned int i=0;i<new_T[no].size();i++){
if(depth[new_T[no][i].to]==0){
bz_max[new_T[no][i].to][0]=new_T[no][i].val;
bz[new_T[no][i].to][0]=no;
dfs(new_T[no][i].to,deep+1);
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
if(x==y)continue;
N.to=y;N.val=z;
T[x].push_back(N);
N.to=x;
T[y].push_back(N);
k++;
ed[k].from=x;ed[k].to=y;ed[k].val=z;
}sort(ed+1,ed+k+1,cmp);
int tmp=k;k=1;
for(int i=1;i<n;i++){
while(find(ed[k].to)==find(ed[k].from))k++;
merge(ed[k].to,ed[k].from);
mst[k]=1;
N.to=ed[k].to;N.val=ed[k].val;
new_T[ed[k].from].push_back(N);
N.to=ed[k].from;
new_T[ed[k].to].push_back(N);
sum+=ed[k].val;
}
memset(bz_max,-0x7f,sizeof(bz_max));
memset(bz_min,-0x7f,sizeof(bz_min));
dfs(1,1);
for(int j=1;j<20;j++)
for(int i=1;i<=n;i++)
bz[i][j]=bz[bz[i][j-1]][j-1];
for(int j=1;j<20;j++)
for(int i=1;i<=n;i++)
bz_max[i][j]=max(bz_max[i][j-1],bz_max[bz[i][j-1]][j-1]);
for(int j=1;j<20;j++)
for(int i=1;i<=n;i++){
if(bz_max[i][j-1]==bz_max[bz[i][j-1]][j-1])bz_min[i][j]=max(bz_min[i][j-1],bz_min[bz[i][j-1]][j-1]);
else if(bz_max[i][j-1]<bz_max[bz[i][j-1]][j-1])bz_min[i][j]=max(bz_max[i][j-1],bz_min[bz[i][j-1]][j-1]);
else bz_min[i][j]=max(bz_min[i][j-1],bz_max[bz[i][j-1]][j-1]);
}
for(int i=1;i<=tmp;i++){
if(mst[i])continue;
int maxn=find_max(ed[i].from,ed[i].to),minn=find_min(ed[i].from,ed[i].to);
if(ed[i].val!=maxn)ans=min(ans,sum+ed[i].val-maxn);
else if(minn>=0)ans=min(ans,sum+ed[i].val-minn);
}cout<<ans<<endl;
return 0;
}