题解,求关注
2024-07-10 14:16:05
发布于:浙江
11阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
struct datay
{
long long x,y,z;
}l[300005];
long long n,m,d[300005],f[300005][21],deep[300005],t[300005][21],val=0,t1[300005][21],val1;
bool v[300005];
vector<long long> a[300005],r[300005];
long long dijah(long long x)
{
if(d[x]!=x)d[x]=dijah(d[x]);
return d[x];
}
void dfs(long long x,long long y)
{
deep[x]=deep[y]+1;
f[x][0]=y;
for(int i=0;i<a[x].size();i++)
{
if(a[x][i]==y)continue;
t[a[x][i]][0]=r[x][i];
dfs(a[x][i],x);
}
return;
}
bool cmp(datay q,datay w)
{
return q.z<w.z;
}
long long LCA(long long x,long long y)
{
val=0;
val1=0;
if(deep[x]<deep[y])swap(x,y);
for(int i=20;i>=0;i--)
{
if(deep[f[x][i]]>=deep[y])
{
if(val1<=t1[x][i])
{
if(t1[x][i]>val)val1=t1[x][i];
else if(t[x][i]>val)val1=val;
else if(t[x][i]!=val)val1=t[x][i];
else val1=max(t1[x][i],val1);
}
else if(t1[x][i]<val1&&t[x][i]>=val1)val1=t[x][i]==val?val1:min(val,t[x][0]);
val=max(val,t[x][i]),x=f[x][i];
}
}
if(x==y)return x;
for(int i=20;i>=0;i--)
{
if(f[x][i]!=f[y][i])
{
if(val1<=t1[x][i])
{
if(t1[x][i]>val)val1=t1[x][i];
else if(t[x][i]>val)val1=val;
else if(t[x][i]!=val)val1=t[x][i];
else val1=max(t1[x][i],val1);
}
else if(t1[x][i]<val1&&t[x][i]>=val1)val1=t[x][i]==val?val1:min(val,t[x][0]);
val=max(val,t[x][i]);
if(val1<=t1[y][i])
{
if(t1[y][i]>val)val1=t1[y][i];
else if(t[y][i]>val)val1=val;
else if(t[y][i]!=val)val1=t[y][i];
else val1=max(t1[y][i],val1);
}
else if(t1[y][i]<val1&&t[y][i]>=val1)val1=t[y][0]==val?val1:min(val,t[y][0]);
val=max(val,t[y][i]);
x=f[x][i];
y=f[y][i];
}
}
if(val>t[x][0])val1=t[x][0];
val=max(val,t[x][0]);
if(val>t[y][0])val1=t[y][0];
val=max(val,t[y][0]);
return f[x][0];
}
int main()
{
long long x,y,s=0,minn=1e15+5;
memset(v,false,sizeof(v));
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&l[i].x,&l[i].y,&l[i].z);
}
for(int i=1;i<=m;i++)d[i]=i;
sort(l+1,l+m+1,cmp);
for(int i=1;i<=m;i++)
{
x=dijah(l[i].x),y=dijah(l[i].y);
if(x!=y)
{
a[l[i].x].push_back(l[i].y);
a[l[i].y].push_back(l[i].x);
r[l[i].x].push_back(l[i].z);
r[l[i].y].push_back(l[i].z);
d[y]=x;
s+=l[i].z;
v[i]=true;
}
}
dfs(1,0);
for(int i=1;i<=20;i++)
{
for(int j=1;j<=n;j++)
{
f[j][i]=f[f[j][i-1]][i-1];
t[j][i]=max(t[j][i-1],t[f[j][i-1]][i-1]);
if(t[j][i-1]!=t[f[j][i-1]][i-1])t1[j][i]=min(t[j][i-1],t[f[j][i-1]][i-1]);
else
{
t1[j][i]=max(t1[j][i-1],t1[f[j][i-1]][i-1]);
}
}
}
for(int i=1;i<=m;i++)
{
if(v[i]||l[i].x==l[i].y)continue;
LCA(l[i].x,l[i].y);
if(val!=l[i].z)minn=min(minn,s-val+l[i].z);
if(val1!=l[i].z)minn=min(minn,s-val1+l[i].z);
}
printf("%lld",minn);
return 0;
}
这里空空如也
有帮助,赞一个