愚蠢的宠物
PID28 / [Stupid]愚蠢的寵物☆
- 提交你的代碼
- 查看討論和題解
并查集?
題目描述背景
大家都知道,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
AC代碼:
#include<iostream> #include<cstdio> using namespace std; #define size 1000001 int father[size],rank[size]; int main() {int N;int i,j;int a,b;while(~scanf("%d",&N)){for(i=1;i<=N;i++){father[i]=i;rank[i]=0;}for(i=1;i<N;i++){scanf("%d %d",&a,&b);father[b]=a;}scanf("%d %d",&a,&b);while(1){rank[a]=1;a=father[a];if(a==1){rank[1]=1;break;}}while(1){if(rank[b]==1){printf("%d\n",b);break;}else{rank[b]=1;b=father[b];} }}return 0; }并查集解決,但是和常規的并查集不太一樣,需要做標記,剛開始沒有做標記WA了
總結
- 上一篇: NYOJ 括号配对问题
- 下一篇: UI标签库专题八:JEECG智能开发平台