1. 程式人生 > >計算輩分(並查集)

計算輩分(並查集)

 

問題

計算輩分

我們國家有個獨特的文化,就是把家族或親戚之間的關係用輩分的單位來表示。這樣的輩分會按照如下方式計算。

基本上把父母和子女之間定義為1輩,這樣計算人之間的輩分。比如說,我和爸爸,爸爸和爺爺都是1輩,我和爺爺成為2輩,爸爸兄弟和爺爺是1輩,我和爸爸兄弟成為3輩。

當給出多個人的父母子女之間的關係時,請編寫能計算提供的兩個人輩分的程式。

輸入

第一行給出所有人數 N。每個人的號碼各個表示為1, 2, ..., N(1 ≤ N ≤ 100)

第二行給出需要計算輩分的兩名不是同一個人的號碼A, B(1 ≤ A, B ≤N)

第三行,給出父母子女之間的關係個數

M

從第四行,通過M行空格劃分給出表示父母子女之間關係的兩個號碼x, y。這時表示的是xy的父母。(1 ≤ x, y ≤ N)

輸出

第一行輸出A, B之間的輩分。有時候,因為兩個人沒有任何親戚關係,所以無法計算輩分,這時請輸出-1

案例輸入

9

7 3

7

1 2

1 3

2 7

2 8

2 9

4 5

4 6

案例輸出

3

#include<stdio.h>

intway[111][111], vis[111];

int n, m,x, y;

int ans =-1;

voiddfs(int node, int d = 0) {

if (vis[node]) return;

if (node == y) { ans = d; return; }

vis [node] = 1;

for (int i=1;i<=n;i++) {

if (!way[node][i] || vis[i]) continue;

dfs (i, d+1);

}

}

int main(){

scanf("%d%d%d%d",&n,&x,&y,&m);

for (int i=1;i<=m;i++) {

int a,b;

scanf ("%d%d",&a,&b);

way[a][b] = way[b][a] = 1;

}

dfs(x);

printf ("%d",ans);

return 0;

}