求助,WA16
  • 板块P2245 星际导航
  • 楼主sycqwq
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/10/28 22:25
  • 上次更新2023/10/27 05:18:09
查看原帖
求助,WA16
151647
sycqwq楼主2022/10/28 22:25

rtqwq

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
struct node
{
    int v,nxt;
}e[maxn<<1];
int head[maxn],tot;
void add(int x,int y)
{
    e[++tot].v=y;
    e[tot].nxt=head[x];
    head[x]=tot;
}
struct edge
{
    int x,y,w;
}a[maxn<<1];
int n,m,q;
int cmp(edge s1,edge s2)
{
    return s1.w<s2.w;
}
int fa[maxn],siz[maxn],son[maxn],dfn[maxn],de[maxn],top[maxn];
int idx,fat[maxn];
void dfs1(int x,int fa)
{
    fat[x]=fa;
    de[x]=de[fa]+1;
    siz[x]=1;
    son[x]=0;
    for(int i=head[x];i;i=e[i].nxt)
    {
        int v=e[i].v;
        if(v==fa)
            continue;
        dfs1(v,x);
        siz[x]+=siz[v];
        if(siz[v]>=siz[son[x]])
            son[x]=v;
    }
}
void dfs2(int x,int tp)
{
    top[x]=tp;
    dfn[x]=++idx;
    if(son[x]==0)
        return;
    dfs2(son[x],tp); 
    for(int i=head[x];i;i=e[i].nxt)
    {
        int v=e[i].v;
        if(dfn[v])
            continue; 
        dfs2(v,v);
    }
}
int lca(int x,int y)
{
    while(top[x]!=top[y])
    { 
        if(de[y]>de[x])
            y=fat[top[y]];
        else
            x=fat[top[x]];
    }
    return de[x]<de[y]?x:y;
}
int b[maxn];
int getfa(int x)
{
    return fa[x]==x?fa[x]:fa[x]=getfa(fa[x]);
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
        cin>>a[i].x>>a[i].y>>a[i].w;
    int cnt=n;
    sort(a+1,a+m+1,cmp);
    for(int i=1;i<=n;i++)
        fa[i]=i;
    for(int i=1;i<=m;i++)
    {
        int fx=getfa(a[i].x),fy=getfa(a[i].y);
        if(fx!=fy)
        {
            fa[fx]=fa[fy]=++cnt;
            fa[cnt]=cnt;
            b[cnt]=a[i].w;
            add(cnt,fx);
            add(fx,cnt);
            add(cnt,fy);
            add(fy,cnt);
        }
    }    
    n=cnt;
    for(int i=n;i>=1;i--)
        if(!de[i])
        { 
            dfs1(i,i); 
            dfs2(i,i); 
        }  
    cin>>q;
    for(int i=1;i<=q;i++)
    {
        int x,y;
        cin>>x>>y;
        if(getfa(x)!=getfa(y))
            cout<<"impossible\n";
        else
            cout<<b[lca(x,y)]<<'\n';
    }
    return 0;
}
2022/10/28 22:25
加载中...