大佬求助
  • 板块灌水区
  • 楼主GalwayGirl
  • 当前回复24
  • 已保存回复24
  • 发布时间2022/7/11 08:44
  • 上次更新2023/10/27 21:09:21
查看原帖
大佬求助
327295
GalwayGirl楼主2022/7/11 08:44
#include<bits/stdc++.h>
#define INF 99999999999
using namespace std;
int n,m,q,c,x,y,z,flag[110000],deep[11000],f[11000][22],fa[11000],head[11000],dis[11000][22];
struct xzh1
{
        int to,w,next;
}e[110000];
struct xzh2
{
        int to,w,next;
}edge[51000];
void add(int u,int v,int w)
{
        c++;
        e[c].next=head[u];
        e[c].w=w;
        e[c].to=v;
        head[u]=c;
}
bool cmp(xzh2 x,xzh2 y)
{
        return x.w>y.w;
}
int find(int x)
{
        if(fa[x]!=x)fa[x]=find(fa[x]); 
        return x;
}
void dfs(int now)
{
        flag[now]=1;
        for(int i=head[now];i;i=e[i].next)
        {
                if(flag[e[i].to]==1)continue;
                deep[e[i].to]=deep[now]+1;
                f[e[i].to][0]=now;
                dis[e[i].to][0]=e[i].w;
                dfs(e[i].to);
        }
}
void pre()
{
        for(int i=1;i<=20;i++)
        {
                for(int j=1;j<=n;j++)
                {
                        f[j][i]=f[f[j][i-1]][i-1];
                        dis[j][i]=dis[dis[j][i-1]][i-1];
                }
        }
}
int LCA(int x,int y)
{
        int ans=INF;
        if(deep[x]<deep[y])swap(x,y);
        for(int i=20;i>=0;i--)
        {
                if(deep[f[x][i]]>=deep[y])
                {
                        ans=min(ans,dis[x][i]);
                        x=f[x][i];
                }
        }
        if(x==y)return ans;
        for(int i=20;i>=0;i--)
        {
              if(f[x][i]!=f[y][i])
                { 
                    ans=min(ans,min(dis[x][i],dis[y][i]));
                    x=f[x][i];
                    y=f[y][i];     
                }
        }
        ans=min(min(dis[x][0],dis[y][0]),ans);
        return ans;
}
int main()
{
        cin>>n>>m;
        for(int i=1;i<=n;i++)fa[i]=i;
        for(int i=1;i<=m;i++)
        {
                cin>>x>>y>>z;
                edge[i].w=z;
                edge[i].to=y;
                edge[i].next=x;
        }
        sort(edge+1,edge+1+m,cmp);
        for(int i=1;i<=m;i++)
        {
                int r1=find(edge[i].next),r2=find(edge[i].to);
                if(r1!=r2)
                {
                        fa[r1]=r2;
                        add(edge[i].next,edge[i].to,edge[i].w);
                        add(edge[i].to,edge[i].next,edge[i].w);
                }
        }
        for(int i=1;i<=n;i++)
        {
                if(flag[i]==0)
                {
                    deep[i]=1;
                    dfs(i);
                    f[i][0]=i;
                    dis[i][0]=INF;
                }
        }
        pre();
        cin>>q;
        while(q--)
        {
                cin>>x>>y;
                if(find(x)!=find(y))cout<<-1<<endl;
                else cout<<LCA(x,y)<<endl;
        }
        return 0;
}
2022/7/11 08:44
加载中...