80分,第八个点和第十个点wa。请求大佬帮忙,谢谢。
代码如下。
#include<bits/stdc++.h>
using namespace std;
#define MAXN 300005
const long long INF= 2147483647000000;
int head[MAXN],fa[MAXN],dep[MAXN],vis[MAXN]={0},f[MAXN][24],tot,n,m,q,sum=0,maxn=0;
long long dp1[MAXN][24],dp2[MAXN][24],ans=INF;
struct edge1{
int x,y,dis;
}e1[MAXN*3];
struct edge2{
int to,nxt,val;
}e2[MAXN*3];
void add(int x,int y,int w){
e2[++tot].to=y;e2[tot].nxt=head[x];e2[tot].val=w;head[x]=tot;
}
bool cmp(edge1 a,edge1 b) {
return a.dis<b.dis;
}
int find(int x) {
if(fa[x]!=x)fa[x]=find(fa[x]);
return fa[x];
}
void unionn(int a,int b) {
int f1a=find(a),fb=find(b);
if(f1a!=fb)fa[f1a]=fb;
}
void kruskal() {
sort(e1+1,e1+m+1,cmp);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++)
if(find(e1[i].x)!=find(e1[i].y)){
vis[i]=1;
unionn(e1[i].x,e1[i].y);
add(e1[i].x,e1[i].y,e1[i].dis);add(e1[i].y,e1[i].x,e1[i].dis);
sum+=e1[i].dis;maxn=max(maxn,e1[i].dis);
}
}
void dfs(int u,int fa){
dep[u]=dep[fa]+1;
for(int i=1;i<=23;i++) {
f[u][i]=f[f[u][i-1]][i-1];
dp1[u][i]=max(dp1[u][i-1],dp1[f[u][i-1]][i-1]);
dp2[u][i]=max(dp2[u][i-1],dp2[f[u][i-1]][i-1]);
if(dp1[u][i-1]!=dp1[f[u][i-1]][i-1]) dp2[u][i]=max(dp2[u][i],min(dp1[u][i-1],dp1[f[u][i-1]][i-1]));
}
for(int i=head[u];i;i=e2[i].nxt) {
int v=e2[i].to;
if(v==fa)continue;
f[v][0]=u;dp1[v][0]=e2[i].val;
dfs(v,u);
}
}
int LCA(int x,int y) {
if(dep[x]<dep[y])swap(x,y);
for(int i=23;i>=0;i--)if(dep[f[x][i]]>=dep[y])x=f[x][i];
if(x==y)return x;
for(int i=23;i>=0;i--) {
if(f[x][i]!=f[y][i]) {
x=f[x][i];y=f[y][i];
}
}
return f[x][0];
}
long long sum1(int u,int v,int w){
int lca1=LCA(u,v);
long long max1=-1,max2=-1;
for(int i=23,h1=dep[u]-dep[lca1],h2=dep[v]-dep[lca1];i>=0;i--){
if(h1&(1<<i)){
if(dp1[u][i]>max1) max2=max1,max1=dp1[u][i];
if(max1>dp1[u][i])max2=max(max2,dp1[u][i]);
max2=max(max2,dp2[u][i]);
}
if(h2&(1<<i)){
if(dp1[v][i]>max1)max2=max1,max1=dp1[v][i];
if(max1>dp1[v][i])max2=max(max2,dp1[v][i]);
max2=max(max2,dp2[v][i]);
}
}
if(max1!=w)return w-max1;
if(max2!=-1)return w-max2;
return 0;
}
int main() {
cin>>n>>m;
for(int i=1;i<=m;i++) {
int x,y,z;
cin>>x>>y>>z;
e1[i].x=x;e1[i].y=y;e1[i].dis=z;
}
kruskal();dfs(1,0);
for(int i=1;i<=m;i++)
if(vis[i]==0) {
if(e1[i].dis-maxn>ans) break;
long long t=sum1(e1[i].x,e1[i].y,e1[i].dis);
if(t!=0)ans=min(ans,t);
}
cout<<ans+sum<<endl;
}