有没有大神帮我看看,或出个 hack 数据。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+7;
int n,m;
struct Node
{
bool pd;
int frm,to,val;
friend bool operator < (const Node A,const Node B){return A.val<B.val;}
}mp[N];
int fa[N];
int dep[N];
int MST;
int ans=1e18;
struct EDGE
{
int frm,to,val;
}edge[N];
int cnt,head[N];
inline void add(int x,int y,int w)
{
edge[++cnt].to=y;
edge[cnt].frm=head[x];
edge[cnt].val=w;
head[x]=cnt;
}
int f[N][21];
int g1[N][21];
int g2[N][21];
inline int Find(int x){return fa[x]==x?x:fa[x]=Find(fa[x]);}
inline void dfs(int x,int fa)
{
for(int i=head[x];i;i=edge[i].frm)
{
int v=edge[i].to;
int w=edge[i].val;
if(v==fa) continue;
dep[v]=dep[x]+1;
f[v][0]=x;
g1[v][0]=w;
g2[v][0]=-1e18;
dfs(v,x);
}
}
inline void init()
{
for(int j=1;j<=20;j++)
{
for(int i=1;i<=n;i++)
{
f[i][j]=f[f[i][j-1]][j-1];
g1[i][j]=max(g1[i][j-1],g1[f[i][j-1]][j-1]);
g2[i][j]=max(g2[i][j-1],g2[f[i][j-1]][j-1]);
if(g1[i][j-1]<g1[f[i][j-1]][j-1]) g2[i][j]=max(g2[i][j],g1[i][j-1]);
else if(g1[i][j-1]>g1[f[i][j-1]][j-1]) g2[i][j]=max(g2[i][j],g1[f[i][j-1]][j-1]);
}
}
}
inline void LCA(int x,int y,int w)
{
if(dep[y]>dep[x]) swap(x,y);
int max1=-1,max2=-1;
for(int i=20;i>=0;i--)
{
if(dep[f[x][i]]>=dep[y])
{
max1=max(max1,g1[x][i]);
max2=max(max2,g2[x][i]);
x=f[x][i];
}
}
if(x==y)
{
if(max1!=w)
ans=min(ans,MST-max1+w);
else if(max2!=w&&max2>0)
ans=min(ans,MST-max2+w);
return;
}
for(int i=20;i>=0;i--)
{
if(dep[f[x][i]]!=dep[f[y][i]])
{
max1=max(max1,max(g1[x][i],g1[y][i]));
max2=max(max2,max(g2[x][i],g2[y][i]));
x=f[x][i];
y=f[y][i];
}
}
max1=max(max1,max(g1[x][0],g1[y][0]));
if(g1[x][0]!=max1) max2=max(max2,g1[x][0]);
if(g1[y][0]!=max1) max2=max(max2,g1[y][0]);
if(max1!=w)
ans=min(ans,MST-max1+w);
else if(max2!=w&&max2>0)
ans=min(ans,MST-max2+w);
}
signed main()
{
scanf("%lld %lld",&n,&m);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++)
{
int x,y,w;
scanf("%lld %lld %lld",&x,&y,&w);
if(x==y) continue;
mp[i].frm=x;
mp[i].to=y;
mp[i].val=w;
}
sort(mp+1,mp+1+m);
for(int i=1;i<=m;i++)
{
int xx=Find(mp[i].frm);
int yy=Find(mp[i].to);
if(xx==yy) continue;
fa[xx]=yy;
MST+=mp[i].val;
mp[i].pd=1;
add(mp[i].frm,mp[i].to,mp[i].val);
add(mp[i].to,mp[i].frm,mp[i].val);
}
dfs(1,0);
init();
for(int i=1;i<=m;i++)
if(!mp[i].pd)
LCA(mp[i].frm,mp[i].to,mp[i].val);
printf("%lld\n",ans);
}