95 分求助
查看原帖
95 分求助
239970
crystallinum楼主2022/7/19 16:54
#include <bits/stdc++.h>
#define MAXN 300000
using namespace std;
struct edge
{
    int to,nxt,w;
}e[MAXN*2];
int head[MAXN],cnt;
struct sta
{
    int u,v,lca,dis;
}road[MAXN];
int sum,n,m,k;
int num[MAXN],min[MAXN],tmp[MAXN],vis[MAXN],dis[MAXN],dep[MAXN];
int fa[MAXN][25],dp[MAXN][25];
void addline(int u,int v,int w)
{
    e[++cnt].to=v;
    e[cnt].nxt=head[u];
    e[cnt].w=w;
    head[u]=cnt;
}
void dfs(int x,int p,int depth)
{
    k++;
    num[k]=x;
    dep[x]=depth;
    vis[x]=1;
    for (int i=1;i<=23;i++)
    {
        fa[x][i]=fa[fa[x][i-1]][i-1];
    }
    for (int i=head[x];i;i=e[i].nxt)
    {
        int ed=e[i].to;
        if (!vis[ed])
        {
            fa[ed][0]=x;
            dis[ed]=dis[x]+e[i].w;
            dfs(ed,x,depth+1);
        }
    }
}
int lca(int u,int v)
{
    if (dep[u]<dep[v])
    {
        swap(u,v);
    }
    int t=dep[u]-dep[v];
    for (int i=0;i<25;i++)
    {
        if (t&(1<<i))
        {
            u=fa[u][i];
        }
    }
    if (u==v)
    {
        return u;
    }
    for (int i=24;i>=0;i--)
    {
        if (fa[u][i]!=fa[v][i])
        {
            u=fa[u][i];
            v=fa[v][i];
        }
    }
    return fa[u][0];
}
bool check(int mid)
{
    int cnt1=0;
    int ans=0;
    memset(tmp,0,sizeof(tmp));
    for (int i=1;i<=m;i++)
    {
        if (road[i].dis>mid)
        {
            tmp[road[i].u]++;
            tmp[road[i].v]++;
            tmp[road[i].lca]-=2;
            ans=max(ans,road[i].dis-mid);
            cnt1++;
        }
    }
    if (cnt1==0)
    {
        return true;
    }
    for (int i=n;i>=1;i--)
    {
        tmp[fa[num[i]][0]]+=tmp[num[i]];
    }
    for (int i=2;i<=n;i++)
    {
        if (tmp[i]==cnt1&&dis[i]-dis[fa[i][0]]>=ans)
        {
            return true;
        }
    }
    return false;
}
int main()
{
    scanf("%d %d",&n,&m);
    for (int i=1;i<=n-1;i++)
    {
        int u,v,w;
        scanf("%d %d %d",&u,&v,&w);
        addline(u,v,w);
        addline(v,u,w);
        sum+=w;
    }
    dis[1]=0;
    dfs(1,0,1);
    for (int i=1;i<=m;i++)
    {
        scanf("%d %d",&road[i].u,&road[i].v);
        road[i].lca=lca(road[i].u,road[i].v);
        road[i].dis=dis[road[i].u]+dis[road[i].v]-2*dis[road[i].lca];
    }
    int l=0,r=sum;
    int mid;
    while (l<r)
    {
        mid=(l+r)>>1;
        if (check(mid))
        {
            r=mid;
        }
        else
        {
            l=mid+1;
        }
    }
    printf("%d\n",l);
    return 0;
}

Subtask 2 的 #13 WA 掉了,
其余的全部 AC。

2022/7/19 16:54
加载中...