*玄关*求助!倍增求lca!
查看原帖
*玄关*求助!倍增求lca!
1399216
_Gloaming_楼主2024/8/14 16:49
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+100,inf=1e5+2000;
struct node
{
    int u,v,w;
}t[N*5];
struct edge
{
    int u,v,w;
}e[N*5];
int h[N],cnt,st[N][20],w[N][20],dep[N];
int n,m,q,par[N];
bool cmp(node a,node b)
{
    return a.w>b.w;
}
void add(int u,int v,int w)
{
    cnt++;
    e[cnt].u=h[u];
    e[cnt].w=w;
    e[cnt].v=v;
    h[u]=cnt;
}
int find(int x)
{
    if(par[x]==x)
        return par[x];
    return find(par[x]);
}
void merge(int x,int y)
{
    int xx=find(x);
    int yy=find(y);
    if(xx!=yy)
        par[x]=yy;
}
void kru()
{
    for(int i=1;i<=n;i++)
        par[i]=i;
    sort(t+1,t+m+1,cmp);
    for(int i=1;i<=m;i++)
    {
        if(find(t[i].u)==find(t[i].v))
            continue;
        add(t[i].u,t[i].v,t[i].w);
        add(t[i].v,t[i].u,t[i].w);
        merge(t[i].u,t[i].v);
    }
}
void dfs(int x,int fa,int val)
{
    dep[x]=dep[fa]+1;
    st[x][0]=fa;
    w[x][0]=val;
    for(int i=1;1<<i<=dep[x];i++)
    {
        st[x][i]=st[st[x][i-1]][i-1];
        w[x][i]=min(w[x][i-1],w[st[x][i-1]][i-1]);
    }
    for(int i=h[x];i;i=e[i].u)
    {
        int v=e[i].v;
        if(v!=fa)
            dfs(v,x,e[i].w);
    }
}
int lca(int a,int b)
{
    int ans=inf;
    if(dep[a]<dep[b])
        swap(a,b);
    while(dep[a]>dep[b])
    {
        int k=log2(dep[a]-dep[b]);
        cout<<k<<" "<<a<<" "<<dep[a]<<" "<<b<<" "<<dep[b]<<"\n";       
        a=st[a][k];
        ans=min(ans,w[a][k]);
        cout<<ans<<" "<<w[a][k]<<"\n";
    }
    if(a==b)
        return ans;
    for(int i=1;1<<i<=dep[a]+1;i++)
    {
        if(st[a][i]!=st[b][i])
        {
            cout<<2<<" "<<a<<" "<<dep[a]<<" "<<b<<" "<<dep[b]<<"\n";       
            a=st[a][i],b=st[b][i];
            ans=min(ans,min(w[a][i],w[b][i]));
        }
    }
    return min(ans,min(w[a][0],w[b][0]));
}
int main()
{
    memset(w,inf,sizeof(w));
    cin>>n>>m;
    for(int i=1;i<=m;i++)
        cin>>t[i].u>>t[i].v>>t[i].w;
    kru();
    for(int i=1;i<=n;i++)
    {
        if(par[i]==i)
            dfs(i,i,inf);  
    }
    cin>>q;
    cout<<w[3][1]<<" "<<w[1][3]<<"\n";
    while(q--)
    {
        int x,y;
        cin>>x>>y;
        if(find(x)!=find(y))
            cout<<"-1"<<"\n";
        else
            cout<<lca(x,y)<<"\n";
    }
}

为什么我w数组都是1886417008

2024/8/14 16:49
加载中...