小A的最短路

小A的最短路

https://ac.nowcoder.com/acm/problem/23482

先不看线缆,会发现,直接用lca求最短路就行了
加上线缆,就多加一个判断即可
比如询问x到y,线缆是j到k
在dis(x,y),dis(x,j)+dis(k,y),dis(x,k)+dis(j,y)这三个中取最小

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#define ll long long
#define pi 3.1415927
#define inf 0x3f3f3f3f
#define mod 1000000007
using namespace std;
#define _int __int128_t
inline int read()
{
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar();
    return f*x;
}
void print(int x)
{
    if(x < 0) {putchar('-');x = -x;}
    if(x/10) print(x/10);
    putchar(x%10+'0');
}
int n,m,head[1000005],dep[1000005],f[1000005][30],tot;
struct node{
    int to,next;
}edge[1000005];
void add(int u, int v)
{
    edge[++tot].to=v;
    edge[tot].next=head[u];
    head[u]=tot;
}
void dfs(int u, int father)
{
    dep[u]=dep[father]+1;
    for(int i=1;i<=20;i++)
        f[u][i]=f[ f[u][i-1] ][i-1];
    for(int i=head[u]; i ;i=edge[i].next){
        if(edge[i].to==father)
            continue;
        f[edge[i].to][0]=u;
        dfs(edge[i].to,u);
    }
}
int lca(int x, int y)
{
    if(dep[x]<dep[y])
        swap(x,y);
    for (int i = 20; i >= 0; i--) 
        if (dep[f[x][i]] >= dep[y])
            x=f[x][i];
    if(x==y)
        return x;
    for(int i=20;i>=0;i--){
        if(f[x][i]!=f[y][i]){
            x=f[x][i];
            y=f[y][i];
        }
    }
    return f[x][0];
}
int disc(int x, int y)
{
    return dep[x]+dep[y]-2*dep[lca(x,y)];
}
int main ()
{
    int T,i,t,j,k,p,sum=0;
    n=read();
    for(i=1;i<n;++i){
        int u=read(),v=read();
        add(u,v);
        add(v,u);
    }
    dfs(1,0);
    j=read(); k=read();
    int q=read();
    for(i=1;i<=q;++i){
        int x=read(),y=read();
        int ans=disc(x,y);
        ans=min(ans,disc(x,j)+disc(k,y));
        ans=min(ans,disc(x,k)+disc(j,y));
        printf("%d\n",ans);
    }
    return 0;
}
全部评论

相关推荐

后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
点赞 评论 收藏
分享
虽然大家都在劝退读研,说读研以后也是打工,不如本科直接去打工,但随着现在研究生越来越多,很多企业招聘要求就会变成研究生起招,本科投递简历就会被卡,横向比较时也会因为"本科学历比不上研究生学历"被筛掉,而且你没发现劝退读研的基本都是读完研的人吗?而且进体制、国企等,研究生也比本科生升的快,他们拿着研究生文凭劝你一个本科生,可别当真了
炬火初现:肯定是说本科能有好工作或者满意的可以不读研啊,现在本科能找到好工作的那个不优秀,大学四年赛高中,而且还要和学校斗智斗勇,这种时候自然有的选,要是只是觉得一辈子混口饭吃,大概率也考不上研,或者考上又浑浑噩噩三年,也难说。 而且考研所谓的优势说实话是你用差不多四年的时间成本(考一年,读三年)换过来的,而且还未必读完有今年的就业市场,当然不能随便决定读。 再还要看专业,一些稀奇古怪的专业说实话根本没有办法创造出什么价值,也没钱赚(如果有爱好,可以适当降低报酬标准)。现在非92的研究生说实话也没啥太多所谓优势,难说。 所以任何时候都要具体情况具体分析,不能一概而论。 一点点小看法。欢迎大家友善讨论。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务