RE 求助!
查看原帖
RE 求助!
681036
OldDriverTree楼主2023/8/1 19:44

rt,样例能过,#1 RE

#include<bits/stdc++.h>
#define v to[i]
#define w val[i]
using namespace std;
const int N=2e4,M=1e5;
int tot,head[N],nxt[N<<1],to[N<<1],val[N<<1];
int n,m,q,fa[N],depth[N],f[N][15],minv[N][15];

struct edge
{
    int x,y,z;
    bool operator <(edge o)const {
        return z>o.z;
    }
}e[M];

int read() {
    int x=0; char ch=0; while (!isdigit(ch) ) ch=getchar();
    while (isdigit(ch) ) x=(x<<3)+(x<<1)+(ch&15),ch=getchar();
    return x;
}
void add(int x,int y,int z) {
    to[tot]=y,val[tot]=z,nxt[tot]=head[x],head[x]=tot++;
    to[tot]=x,val[tot]=z,nxt[tot]=head[y],head[y]=tot++;
}
int find(int x) {
    return fa[x]^x?fa[x]=find(fa[x]):x;
}
bool merge(int x,int y) {
    x=find(x),y=find(y);
    fa[x]=y; return x^y;
}
int kruskal()
{
    sort(e,e+m);
    for (int i=0;i<m;i++)
        if (merge(e[i].x,e[i].y) )
            add(e[i].x,e[i].y,e[i].z);
}
void dfs(int u,int Fa) {
    for (int i=1;i<15;i++) f[u][i]=f[f[u][i-1] ][i-1],minv[u][i]=min(minv[u][i-1],minv[f[u][i-1] ][i-1]);
    depth[u]=depth[Fa]+1; for (int i=head[u];~i;i=nxt[i]) if (v^Fa) f[v][0]=u,minv[v][0]=w,dfs(v,u);
}
int LCA(int x,int y)
{
    int ans=1e9; if (depth[x]>depth[y]) swap(x,y); for (int i=14;~i;i--)
    if (depth[x]<=depth[f[y][i] ]) ans=min(ans,minv[y][i]),y=f[y][i]; if (x==y) return ans;
    for (int i=14;~i;i--) if (f[x][i]^f[y][i]) ans=min(ans,min(minv[x][i],minv[y][i]) ),x=f[x][i],y=f[y][i];
    return min(ans,min(minv[x][0],minv[y][0]) );
}
void clear()
{
    tot=0;
    memset(f,0,sizeof f);
    memset(minv,0x3f,sizeof minv);
    memset(depth,0,sizeof depth);
}
int main()
{
    while (~scanf("%d%d%d",&n,&m,&q) )
    {
        clear();
        memset(head,-1,sizeof head);
        for (int i=1;i<=n;i++) fa[i]=i;
        for (int i=0;i<m;i++) e[i]={read(),read(),read()};
        kruskal(); for (int i=1;i<=n;i++) if (!depth[i]) dfs(i,0);
        while (q--) printf("%d\n",LCA(read(),read() ) );
    }
    return 0;
}
2023/8/1 19:44
加载中...