愚蠢的宠物

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了





你可能感兴趣的:(愚蠢的宠物)