1. 程式人生 > >【rqnoj 28】[Stupid]愚蠢的寵物

【rqnoj 28】[Stupid]愚蠢的寵物

spa 結點 背景 names sizeof main father 什麽 bsp

題目描述

背景

大家都知道,sheep有兩只可愛的寵物(一只叫神牛,一只叫神菜)。有一天,sheep帶著兩只寵物到狗狗家時,這兩只可愛的寵物竟然迷路了……

描述

狗狗的家因為常常遭到貓貓的攻擊,所以不得不把家裏前院的路修得非常復雜。狗狗家前院有N個連通的分叉結點,且只有N-1條路連接這N個節點,節點的編號是1-N(1為根節點)。sheep的寵物非常笨,他們只會向前走,不會退後(只向雙親節點走),sheep想知道他們最早什麽時候會相遇(即步數最少)。

N的範圍《=1000000

輸入格式第1行:一個正整數N,表示節點個數。

第2~N行:兩個非負整數A和B,表示A是B的雙親。(保證A,B<=n)

第N+1行:兩個非負整數A和B,表示兩只寵物所在節點的位置。(保證A,B<=n)

輸出格式輸出他們最早相遇的節點號。

樣例輸入

10
1 2
1 3
1 4
2 5
2 6
3 7
4 8
4 9
4 10
3 6

樣例輸出

1

#include<iostream>
#include<cstring>
using namespace std;
int father[1000000];
int a[1000000],b[1000000];
int main(){
    memset(a,127/3,sizeof(a));
    memset(b,127/3,sizeof(b));
    int x,y;
    
int n; cin>>n; for(int i=1;i<=n;i++) father[i]=i; for(int i=1;i<n;i++){ cin>>x>>y; father[y]=x; } cin>>x>>y; for(int i=0;i<n;i++){ a[x]=min(i,a[x]); x=father[x]; b[y]=min(i,b[y]); y=father[y]; }
int mn=999999,ans; for(int i=1;i<=n;i++) if(a[i]+b[i]<mn){mn=a[i]+b[i];ans=i;} cout<<ans; return 0; }

【rqnoj 28】[Stupid]愚蠢的寵物