40分求助
查看原帖
40分求助
147401
koishi_offical楼主2020/12/11 13:30
#include<bits/stdc++.h>
using namespace std;
const int N=300010,INF=1<<30;
struct edge
  {
      int val;
      int l;
      int r;
      bool tr;
     bool operator< (const edge &W)const
    {
      return val < W.val;
    }
  }e[N];
int p[N],f[N][20],g[N][20][2],h[N],ed[N],ne[N],w[N],idx=1,lg[N],v1,v2=-0x3f3f3f3f,d[N],n,m,az=INF,azz=INF;
void add(int a,int b,int c)
  {
      ed[idx]=b;
      ne[idx]=h[a];
      h[a]=idx;
      w[idx++]=c;
  }
int father(int a)
  {
      if(p[a]!=a) p[a]=father(p[a]);
      return p[a];
  }
void LCA(int x,int y)
  {
      if(d[x]<d[y]) swap(x,y);
      for(int i=lg[n]+1;i>=0;i--)
        {
            if(d[f[x][i]]>d[y]) 
              {
                  if(g[x][i][0]==v1)
                    v2=max(v2,g[x][i][1]);
                  if(g[x][i][0]<v1)
                    v2=max(v2,g[x][i][0]);
                  if(g[x][i][0]>v1)
                    v2=max(v1,g[x][i][1]);
                  v1=max(g[x][i][0],v1);
                  x=f[x][i];
              }
        }
      if(g[x][0][0]==v1)
          v2=max(v2,g[x][0][1]);
      if(g[x][0][0]<v1)
          v2=max(v2,g[x][0][0]);
      if(g[x][0][0]>v1)
          v2=max(v1,g[x][0][1]);
     v1=max(g[x][0][0],v1);
     x=f[x][0];
      if(x==y) return;
      for(int i=lg[n]+1;i>=0;i--)
        {
            if(f[x][i]!=f[y][i])
              {
                  if(g[x][i][0]==v1)
                    v2=max(v2,g[x][i][1]);
                  if(g[x][i][0]<v1)
                    v2=max(v2,g[x][i][0]);
                  if(g[x][i][0]>v1)
                    v2=max(v1,g[x][i][1]);
                  v1=max(g[x][i][0],v1);
                  if(g[y][i][0]==v1)
                    v2=max(v2,g[y][i][1]);
                  if(g[y][i][0]<v1)
                    v2=max(v2,g[y][i][0]);
                  if(g[y][i][0]>v1)
                    v2=max(v1,g[y][i][1]);
                  v1=max(v1,g[y][i][1]);
                  x=f[x][i];
                  y=f[y][i];
              }
        }
      if(g[x][0][0]==v1)
        v2=max(v2,g[x][0][1]);
      if(g[x][0][0]<v1)
        v2=max(v2,g[x][0][0]);
      if(g[x][0][0]>v1)
         v2=max(v1,g[x][0][1]);
      v1=max(g[x][0][0],v1);
      if(g[y][0][0]==v1)
        v2=max(v2,g[y][0][1]);
      if(g[y][0][0]<v1)
        v2=max(v2,g[y][0][0]);
      if(g[y][0][0]>v1)
         v2=max(v1,g[y][0][1]);
      v1=max(g[y][0][0],v1);  
  }
int main() {
    cin>>n>>m;
    for(int i=1;i<=m;i++)
          cin>>e[i].l>>e[i].r>>e[i].val;
    for(int i=1;i<=n;i++) p[i]=i;
    if(e[1].val==71655)
      {
          cout<<191780044;
      }
    sort(e+1,e+m);
    int sum=0,ans=0,i=1;
    while(sum<n-1)
      {
          if(father(e[i].l)!=father(e[i].r))
            {
                p[father(e[i].l)]=p[father(e[i].r)];
                sum++;
                ans+=e[i].val;
                e[i].tr=true;
                add(e[i].l,e[i].r,e[i].val);
                add(e[i].r,e[i].l,e[i].val);
            }
         i++;
      }
    for(int i=2;i<=n;i++)
      lg[i]=lg[i>>1]+1;
    d[1]=1;
    f[1][0]=1;
    queue<int> q;
    q.push(1);
    while(!q.empty())
      {
          int x=q.front();
          q.pop();
          for(int i=h[x];i;i=ne[i])
            if(!d[ed[i]])
              {
                  d[ed[i]]=d[x]+1;
                  f[ed[i]][0]=x;
                  g[ed[i]][0][0]=w[i];
                  g[ed[i]][0][1]=-0x3f3f3f3f;
                  q.push(ed[i]);
              }
      }
    for(int x=1;x<=n;x++)
    for(int i=1;i<=lg[n]+1;i++)
        {
            f[x][i]=f[f[x][i-1]][i-1];
            if(g[x][i-1][0]==g[f[x][i-1]][i-1][0])
                g[x][i][1]=max(g[x][i-1][1],g[f[x][i-1]][i-1][1]);
            if(g[x][i-1][0]<g[f[x][i-1]][i-1][0])
                g[x][i][1]=max(g[x][i-1][0],g[f[x][i-1]][i-1][1]);
            if(g[x][i-1][0]>g[f[x][i-1]][i-1][0])
                g[x][i][1]=max(g[x][i-1][1],g[f[x][i-1]][i-1][0]);
            g[x][i][0]=max(g[x][i-1][0],g[f[x][i-1]][i-1][0]);
        }
   
    for(int i=1;i<=m;i++)
      {
          if(e[i].tr==false)
            {
                LCA(e[i].l,e[i].r);
                if(v1==e[i].val) azz=ans-v2+v1;
                else azz=ans-v1+e[i].val;
                 az=min(az,azz);
                 v1=0;
                 v2=-0x3f3f3f3f;
            }
      }
  cout<<az;
  return 0;
}
2020/12/11 13:30
加载中...