大佬们救救孩子吧!!!
我的代码(过不了样例)
#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=40005;
struct node{
int u;
int w;
node(){}
node(int U,int W){
u=U,w=W;
}
};
struct edge{
int u,v,w;
};
edge G[MAXN];
vector<node> g[MAXN];
void insert(int u,int v,int w){
g[u].push_back(node(v,w));
g[v].push_back(node(u,w));
}
int f[MAXN][20],maxn[MAXN][20],d[MAXN];
int maxm[MAXN][20];//次大
bool vis[MAXN];
void dfs(int u){
d[u]=d[f[u][0]]+1;
for(int i=0;i<g[u].size();i++){
int v=g[u][i].u;
int w=g[u][i].w;
if(v==f[u][0]){
continue;
}
f[v][0]=u;
maxn[v][0]=w;
maxm[v][0]=-0x3f3f3f3f;
dfs(v);
}
}
void pre_f(int n){
for(int j=1;(1<<j)<=n;j++){
for(int i=1;i<=n;i++){
f[i][j]=f[f[i][j-1]][j-1];
maxn[i][j]=max(maxn[i][j-1],maxn[f[i][j-1]][j-1]);
if(maxn[i][j-1]==maxn[f[i][j-1]][j-1]){
maxm[i][j]=max(maxm[i][j-1],maxm[f[i][j-1]][j-1]);
}
else if(maxn[i][j-1]<maxn[f[i][j-1]][j-1]){
maxm[i][j]=max(maxn[i][j-1],maxm[f[i][j-1]][j-1]);
}
else{
maxm[i][j]=max(maxm[i][j-1],maxn[f[i][j-1]][j-1]);
}
}
}
}
int lca(int x,int y){
int maxans=-0x3f3f3f3f;
if(d[x]<d[y]){
swap(x,y);
}
int k=0;
while((1<<(k+1))<=d[x]) k++;
for(int j=k;j>=0;j--){
if(d[f[x][j]]>=d[y]){
maxans=max(maxans,maxn[x][j]);
x=f[x][j];
}
}
if(x==y){
return maxans;
}
for(int j=k;j>=0;j--){
if(f[x][j]!=f[y][j]){
maxans=max(maxans,maxn[x][j]);
maxans=max(maxans,maxn[y][j]);
x=f[x][j],y=f[y][j];
}
}
return max(maxans,max(maxn[y][0],maxn[x][0]));
}
int fa[MAXN];
int get(int x){
if(fa[x]==x){
return x;
}
return fa[x]=get(fa[x]);
}
bool cmp(edge x,edge y){
return x.w<y.w;
}
int sum=0;
int kruskal(int n,int m){
sort(G+1,G+1+m,cmp);
for(int i=1;i<=m;i++){
int fu=get(G[i].u);
int fv=get(G[i].v);
if(fu!=fv){
fa[fv]=fu;
sum+=G[i].w;
vis[i]=true;
}
insert(G[i].u,G[i].v,G[i].w);
}
return sum;
}
int val1,val2;
void update2(int x){
if(x>val1){
val2=val1;
val1=x;
}
else if(x>val2 && x!=val1){
val2=x;
}
}
void update(int x,int t){
update2(maxn[x][t]);
update2(maxm[x][t]);
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
int u,v,w;
for(int i=1;i<=m;i++){
scanf("%d %d %d",&G[i].u,&G[i].v,&G[i].w);
}
dfs(1);
pre_f(n);
int minnest=kruskal(n,m);
int ans=0x3f3f3f3f;
for(int i=1;i<=m;i++){
if(!vis[i]){
lca(G[i].u,G[i].v);
if(val1!=G[i].w){
ans=min(ans,sum-val1+G[i].w);
}
else{
ans=min(ans,sum-val2+G[i].w);
}
}
}
printf("%d",ans);
return 0;
}