#WA on #3求助大佬
查看原帖
#WA on #3求助大佬
748080
styz_gaozhiyuan楼主2023/4/9 09:46
#include<bits/stdc++.h>
using namespace std;
#define maxn 1000070
#define maxc 2000070
#define maxm 3000070
struct edge{
   int nxt,to,val;
}e[maxc];
int h[maxn],cnt=0;
void add(int u,int v,int w)
{
   e[++cnt].nxt=h[u];
   e[cnt].to=v;
   e[cnt].val=w;
   h[u]=cnt;
}
struct edge1{
   int u,v,w;
   bool used;
}e1[maxm];
int n,m,fa[maxn];
long long ans0;
bool cmp(edge1 a,edge1 b)
{
   return a.w<b.w;
}
int find(int x)
{
   if(x!=fa[x])return fa[x]=find(fa[x]);
   return x;
}int sum;
void kruskal()
{
   sort(e1+1,e1+m+1,cmp);
   for(int i=1;i<=m;i++)
   {
   	int u=find(e1[i].u),v=find(e1[i].v);
   	if(u==v)continue;
   	ans0+=e1[i].w;
   	sum++;
   	add(e1[i].u,e1[i].v,e1[i].w);
   	add(e1[i].v,e1[i].u,e1[i].w);
   	e1[i].used=true;fa[v]=u;
   	if(sum==n-1)break;
   }
}

int f[maxn][35],mx[maxn][35],mx2[maxn][35],dep[maxn];
void dfs(int u)
{
   dep[u]=dep[f[u][0]]+1;
   for(int i=1;i<=19;i++)
   {
   	f[u][i]=f[f[u][i-1]][i-1];
   	if(mx[u][i-1]==mx[f[u][i-1]][i-1])
   	{
   		mx[u][i]=mx[u][i-1];
   		mx2[u][i]=max(mx2[f[u][i-1]][i-1],mx2[u][i-1]);
   	}
   	if(mx[u][i-1]>mx[f[u][i-1]][i-1])
   	{
   		mx[u][i]=mx[u][i-1];
   		mx2[u][i]=max(mx[f[u][i-1]][i-1],mx2[u][i-1]);
   	}
   	if(mx[f[u][i-1]][i-1]>mx[u][i-1])
   	{
   		mx[u][i]=mx[f[u][i-1]][i-1];
   		mx2[u][i]=max(mx[u][i-1],mx2[f[u][i-1]][i-1]);
   	}
   }
   for(int i=h[u];i;i=e[i].nxt)
   {
   	int v=e[i].to,w=e[i].val;
   	if(v==f[u][0])continue;
   	f[v][0]=u;mx[v][0]=w;dfs(v);
   	mx2[v][0]=-0x7f7f7f7f;
   }
}

int lca(int u,int v)
{
   if(dep[u]<dep[v])swap(u,v);
   for(int i=19;i>=0;i--)
       if(dep[u]-dep[v]>=(1<<i))
           u=f[u][i];
   if(u==v)return u;
   for(int i=19;i>=0;i--)
       if(f[u][i]!=f[v][i])
           u=f[u][i],v=f[v][i];
   return f[u][0];
}

long long cal(int u,int v,int w)
{
   int l=lca(u,v);
   int nmx=0,nmx2=0;
   for(int i=19;i>=0;i--)
   {
   	if(dep[f[u][i]]>=dep[l])
   	{
   		if(nmx==mx[u][i])nmx2=max(mx2[u][i],nmx2);
   		if(nmx>mx[u][i])nmx2=max(mx[u][i],nmx2);
   		if(nmx<mx[u][i])
   		{
   			nmx2=max(mx[u][i],nmx);nmx=mx[u][i];
   		}
   		u=f[u][i];
   	}
   	if(dep[f[v][i]]>=dep[l])
   	{
   		if(nmx==mx[v][i])nmx2=max(mx2[v][i],nmx2);
   		if(nmx>mx[v][i])nmx2=max(mx[v][i],nmx2);
   		if(nmx<mx[v][i])
   		{
   			nmx2=max(mx2[v][i],nmx);
   			nmx=mx[v][i];
   		}
   		v=f[v][i];
   	}
   }
   if(w!=nmx)return ans0-nmx+w;
   if(nmx2)return ans0-nmx2+w;
   return 0x7f7f7f7f7f7f7f7f;
}
int vis[300010],vis2[300010];
int main()
{
   scanf("%d%d",&n,&m);
   memset(mx,-0x7f7f7f7f,sizeof(mx));
   memset(mx2,-0x7f7f7f7f,sizeof(mx2));
   for(int i=1;i<=m;i++)
   {
   	scanf("%d%d%d",&e1[i].u,&e1[i].v,&e1[i].w);
   	if(e1[i].u==e1[i].v)
   	{
   		i--;
   		m--;
   	}
   }

   for(int i=1;i<=n;i++)fa[i]=i;
   kruskal();
   dfs(1);
   long long ans=0x7f7f7f7f7f7f7f7f;
   for(int i=1;i<=m;i++)
       if(!e1[i].used)
           ans=min(cal(e1[i].u,e1[i].v,e1[i].w),ans);
   cout<<ans;
   return 0;
}
2023/4/9 09:46
加载中...