求助大佬们,我这有一个小问题
查看原帖
求助大佬们,我这有一个小问题
672737
liuguangyuan楼主2022/2/3 18:33

就是用W[1e6][21]表示节点到它祖先的最大限重,但问题是,我这个W数组竟然没存进去数,可我用F[1e6][21]表示节点的祖先是谁,这个数组就存进去数了,为什么啊QAQ

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
int n,m;
struct Edge
{
    int from,to,dist;
}Edges[maxn];
int cnt=0;
int f[maxn];
vector<Edge>edges;
vector<int>G[maxn];
void add(int from,int to,int dist)
{
    edges.push_back({from,to,dist});
    int m=edges.size();
    G[from].push_back(m-1);
}

bool cmp(Edge a,Edge b)
{
    return a.dist>b.dist;
}

int find(int x)
{
    return f[x]==x?x:find(f[x]);
}

void kruskal()
{
    sort(Edges+1,Edges+1+cnt,cmp);
    for(int i=1;i<=n;i++)
        f[i]=i;
    for(int i=1;i<=m;i++)
    {
        int x=find(Edges[i].from),y=find(Edges[i].to);
        if(x!=y)
        {
            f[x]=y;
            add(Edges[i].from,Edges[i].to,Edges[i].dist);
            add(Edges[i].to,Edges[i].from,Edges[i].dist);
        }
    }
}

int F[maxn][21],W[maxn][21],deep[maxn];
bool vis[maxn];

void dfs(int u,int fa,int d)
{
    vis[u]=true;
    deep[u]=deep[fa]+1;
    F[u][0]=fa;
    W[u][0]=d;
    for(int i=1;(1<<i)<=deep[u];i++)
    {
        F[u][i]=F[F[u][i-1]][i-1];
        W[u][i]=min(W[u][i-1],W[F[u][i-1]][i-1]);
    }
    for(int i=0;i<G[u].size();i++)
    {
        Edge e=edges[G[u][i]];
        int v=e.to;
        if(vis[v])
            continue;
        dfs(v,u,e.dist);
    }
}

int LCA(int x,int y)
{
    if(find(x)!=find(y))
        return -1;
    int ans=inf;
    if(deep[x]>deep[y])
        swap(x,y);
    for(int i=20;i>=0;i--)
    {
        if(deep[F[y][i]]>=deep[x])
        {
            y=F[y][i];
            cout<<ans<<" "<<W[y][i]<<endl;
            ans=min(ans,W[y][i]);
        }

    }
    //cout<<ans;
    if(x==y)
        return ans;
    for(int i=20;i>=0;i--)
    {
        if(F[x][i]!=F[y][i])
        {
            x=F[x][i];
            y=F[y][i];
            ans=min(ans,min(W[x][i],W[y][i]));
        }
    }
    //cout<<" "<<ans;
    ans=min(ans,min(W[x][0],W[y][0]));
    //cout<<" "<<ans<<endl;
    return ans;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        Edges[++cnt].from=x;
        Edges[cnt].to=y;
        Edges[cnt].dist=z;
    }
    kruskal();
    memset(vis,false,sizeof(vis));
    for(int i=1;i<=n;i++)
    {
        if(!vis[i])
        {
            deep[i]=0;
            2dfs(i,0,0);
            W[i][0]=inf;
            F[i][0]=i;

        }
    }
    int q;
    cin>>q;
    for(int i=0;i<q;i++)
    {
        int x,y;
        cin>>x>>y;
        cout<<LCA(x,y)<<endl;
    }

}



2022/2/3 18:33
加载中...