找到错了。。谢谢lrj124提供的数据

倍增求lca的时候先更新x,y再更新的路径上的边权最小值,调了2个小时,悲催啊。。。。
AC代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn=1e4+10;
const int inf=0x3f3f3f3f;
struct edge{
    int from,nxt,to,w;
}e[maxn*20],ed[maxn*10];
int last[maxn],cnt,n,m,dep[maxn],f[maxn][25],c[maxn][25],fa[maxn];
vector<int> Set_of_edge;
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline int read()
{
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
}
inline void insert(int u,int v,int c)
{
    e[++cnt]=(edge){u,last[u],v,c};last[u]=cnt;
    e[++cnt]=(edge){v,last[v],u,c};last[v]=cnt;
}
inline void dfs(int cur,int pre)
{
    f[cur][0]=pre,dep[cur]=dep[pre]+1;
    for(register int i=1;i<=20;i++)
    {
        f[cur][i]=f[f[cur][i-1]][i-1];
        c[cur][i]=min(c[f[cur][i-1]][i-1],c[cur][i-1]);
    }
    for(register int i=last[cur];i;i=e[i].nxt)
    {
        register int v=e[i].to;
        if(v==pre) continue;
        c[v][0]=e[i].w;
        dfs(v,cur);
    }
}
inline int lca(int x,int y)
{
    int ret=inf;
    if(x==y) return 0;
    if(dep[x]<dep[y])swap(x,y);
    for(register int i=20;i>=0;i--)
    {
        if((dep[x]-dep[y])>=(1<<i)) ret=min(ret,c[x][i]),x=f[x][i];
    }
    if(x==y) return ret;
    for(register int i=20;i>=0;i--)
    {
        if(f[x][i]!=f[y][i])
        {
            ret=min(min(c[x][i],c[y][i]),ret);
            x=f[x][i],y=f[y][i];
        }
    }
    if(x==y) return ret;
    return min(min(c[x][0],c[y][0]),ret);
}
inline bool comp(const edge &a,const edge &b)
{
    return a.w>b.w;
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=m;i++)
    {
        int u=read(),v=read(),c=read();
        ed[i].from=u,ed[i].to=v,ed[i].w=c;
    }
    sort(ed+1,ed+1+m,comp);
    for(int i=1;i<=n;i++) fa[i]=i;
    for(register int i=1;i<=m;i++)
    {
        int fx=find(ed[i].from),fy=find(ed[i].to);
        if(fx==fy) continue;
        Set_of_edge.push_back(i),fa[fx]=fy;
    }
    for(register int i=0;i<Set_of_edge.size();i++)
        insert(ed[Set_of_edge[i]].from,ed[Set_of_edge[i]].to,ed[Set_of_edge[i]].w);
    dep[1]=1;
    dfs(1,0);
    int q=read();
    while(q--)
    {
        int s=read(),t=read();
        if(find(s)!=find(t)){puts("-1");continue;}
        printf("%d\n",lca(s,t));
    }
    return 0;
}

0 条评论

目前还没有评论...

信息

ID
1843
难度
7
分类
(无)
标签
递交数
5319
已通过
954
通过率
18%
被复制
10
上传者