計算輩分(並查集)
問題
計算輩分
我們國家有個獨特的文化,就是把家族或親戚之間的關係用輩分的單位來表示。這樣的輩分會按照如下方式計算。
基本上把父母和子女之間定義為1輩,這樣計算人之間的輩分。比如說,我和爸爸,爸爸和爺爺都是1輩,我和爺爺成為2輩,爸爸兄弟和爺爺是1輩,我和爸爸兄弟成為3輩。
當給出多個人的父母子女之間的關係時,請編寫能計算提供的兩個人輩分的程式。
輸入
第一行給出所有人數 N。每個人的號碼各個表示為1, 2, ..., N。(1 ≤ N ≤ 100)
第二行給出需要計算輩分的兩名不是同一個人的號碼A, B。(1 ≤ A, B ≤N)
第三行,給出父母子女之間的關係個數
從第四行,通過M行空格劃分給出表示父母子女之間關係的兩個號碼x, y。這時表示的是x是y的父母。(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;
}