0pts求调
查看原帖
0pts求调
1486095
sunnybear楼主2025/8/29 17:25
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+5;
struct node
{
    int u,v,w;
};
struct node2
{
    int v,w;
};
int n,m;
int ts;
int fa[N][25];
int dp[N][25];
int dep[N];
vector<node> t;
vector<node2>t2[N];
int f[N];
bool vis[N];
int find(int x)
{
    return f[x]=f[x]==x?x:find(f[x]);
}
bool cmp(node a,node b)
{
    return a.w>b.w;
}
void kruskal()
{
    sort(t.begin(),t.end(),cmp);//最大生成树
    for(int i=1; i<=n; i++) f[i]=i;
    for(int i=0; i<m; i++)
    {
        int fu=find(t[i].u);
        int fv=find(t[i].v);
        if(fu!=fv)
        {
            f[fu]=fv;
            t2[fv].push_back({fu,t[i].w});
            t2[fu].push_back({fv,t[i].w});
        }
    }
}
void dfs(int u)
{
    vis[u]=1;
    for(auto [v,w]:t2[u])
    {
        if(!dep[v])
        {
            dep[v]=dep[u]+1;
            fa[v][0]=u;
            dp[v][0]=w;
            dfs(v);
        }
    }
}
void pre()
{
    for(int i=1; i<=20; i++)
    {
        for(int j=1; j<=n; j++)
        {
            fa[j][i]=fa[fa[j][i-1]][i-1];
            dp[j][i]=min(dp[j][i-1],dp[fa[j][i-1]][i-1]);
        }
    }
}
int LCA(int x,int y)
{
    if(find(x)!=find(y)) return -1;
    int ans=1e9;
    if(dep[x]>dep[y]) swap(x,y);
    for(int i=20; i>=0; i--)
    {
        if(dep[fa[y][i]]>=dep[x])
        {
            ans=min(ans,dp[y][i]);
            y=fa[y][i];
        }
    }
    if(x==y) return ans;
    for(int i=20; i>=0; i--)
    {
        if(fa[x][i]!=fa[y][i])
        {
            ans=min({ans,dp[x][i],dp[y][i]});
            x=fa[x][i];
            y=fa[y][i];
        }
    }
    return min({ans,dp[x][0],dp[y][0]});
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int x,y,z,q;
    cin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        cin>>x>>y>>z;
        t.push_back({x,y,z});
    }
    kruskal();
    for(int i=1; i<=n; i++)
    {
        if(!vis[i])
        {
            dep[i]=1;
            dfs(i);
        }
    }
    pre();
    cin>>q;
    while(q--)
    {
        cin>>x>>y;
        cout<<LCA(x,y)<<endl;
    }
    return 0;
}


2025/8/29 17:25
加载中...