L2-016 願天下有情人都是失散多年的兄妹【DFS】
L2-016 願天下有情人都是失散多年的兄妹
https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216
題目
呵呵。大家都知道五服以內不得通婚,即兩個人最近的共同祖先如果在五代以內(即本人、父母、祖父母、曾祖父母、高祖父母)則不可通婚。本題就請你幫助一對有情人判斷一下,他們究竟是否可以成婚?
輸入
輸入第一行給出一個正整數N
(2 ≤ N
≤104),隨後N
行,每行按以下格式給出一個人的資訊:
本人ID 性別 父親ID 母親ID
其中ID
是5位數字,每人不同;性別M
代表男性、F
代表女性。如果某人的父親或母親已經不可考,則相應的ID
位置上標記為-1
。接下來給出一個正整數K
,隨後K
行,每行給出一對有情人的ID
,其間以空格分隔。注意:題目保證兩個人是同輩,每人只有一個性別,並且血緣關係網中沒有亂倫或隔輩成婚的情況。
輸出
對每一對有情人,判斷他們的關係是否可以通婚:如果兩人是同性,輸出Never Mind
;如果是異性並且關係出了五服,輸出Yes
;如果異性關係未出五服,輸出No
。
樣例輸入
24
00001 M 01111 -1
00002 F 02222 03333
00003 M 02222 03333
00004 F 04444 03333
00005 M 04444 05555
00006 F 04444 05555
00007 F 06666 07777
00008 M 06666 07777
00009 M 00001 00002
00010 M 00003 00006
00011 F 00005 00007
00012 F 00008 08888
00013 F 00009 00011
00014 M 00010 09999
00015 M 00010 09999
00016 M 10000 00012
00017 F -1 00012
00018 F 11000 00013
00019 F 11100 00018
00020 F 00015 11110
00021 M 11100 00020
00022 M 00016 -1
00023 M 10012 00017
00024 M 00022 10013
9
00021 00024
00019 00024
00011 00012
00022 00018
00001 00004
00013 00016
00017 00015
00019 00021
00010 00011
樣例輸出
Never Mind
Yes
Never Mind
No
Yes
No
Yes
No
No
分析
用sex陣列記錄每個人的性別,例如 sex[i]='F' 表示編號為 i 的人的性別為女,開始時我們就先判斷他們是否為同性,如果不是同性再判斷是否在五代之內,如何判斷呢?設帶判斷的兩個人的編號分別為a,b,那麼可以先進行依次DFS將a本身及其以上五代內的人都進行標記,然後再對b進行同樣的操作,如果在對b進行DFS的過程中,出現了標記過的人了,則表明不能結婚,否則能結婚。
C++程式
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=100005;
vector<int>g[N];//關係
char sex[N];//編號為i的性別
bool vis[N],flag;
void dfs(int u,int d)//當前結點為u,為第d代
{
if(d==5) return;//如果d等於5就退出
if(vis[u])//如果當前這個人已經被標記過了,說明不能結婚,flag=true,然後退出
{
flag=true;
return;
}
vis[u]=true;//標記
for(int i=0;i<g[u].size();i++)//繼續向上追溯
dfs(g[u][i],d+1);
}
int main()
{
int n,k,x,f,m;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
scanf(" %c%d%d",&sex[x],&f,&m);
if(f!=-1) sex[f]='M',g[x].push_back(f);//如果父親存在
if(m!=-1) sex[m]='F',g[x].push_back(m);//如果母親存在
}
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(sex[a]==sex[b])
{
printf("Never Mind\n");
continue;
}
memset(vis,false,sizeof(vis));
flag=false;
dfs(a,0);
dfs(b,0);
printf("%s\n",flag?"No":"Yes");
}
return 0;
}
相關文章
- 樹的DFS序
- DFS
- 圖的dfs_euler
- DFS樹
- dfs序
- dfs技巧
- 不破不立的《天下4》,點出了天下IP經久不衰的秘訣
- 9*9的數獨(dfs)
- 關於元素排列的DFS
- 願天下無詐|遏制電信網路詐騙,看綠盟科技如何“道高一丈”
- Tempter of the Bone(DFS)
- 深搜dfs
- 求樹的直徑(BFS/DFS)
- dfs的return時機問題
- Prime Ring Problem (dfs)
- DAG bfs + dfs 126,
- 有向圖的拓撲排序——DFS排序
- 《天下》IP全新概念片釋出:勇氣,是天下唯一的路引
- 發的都是手動
- 藍天下的彩色熱氣Mac桌布Mac
- 史上最漂亮的許願牆,許願網,沒有之一
- DFS演算法原理演算法
- DFS序例題+感受
- DFS入門筆記筆記
- dfs檢測是否有環的優化優化
- 速記圖的遍歷(DFS和BFS)
- 行願網-許下心願向前行
- 樹的DFS序列,時間戳,樹的深度,重心時間戳
- Python與家國天下Python
- 匯付天下接入
- DFS(深度優先搜尋)
- 【題目整理】dfs入門
- DFS剪枝最佳化策略
- DFS實現拓撲排序排序
- P1219 八皇后(dfs)
- bzoj4500: 矩陣(dfs)矩陣
- DFS在二叉樹上的表現二叉樹
- 滿載“星”願的奇妙之旅,部落衝突助玩家放飛心願