L2-016 願天下有情人都是失散多年的兄妹【DFS】

Enjoy_process發表於2019-03-29

                                  L2-016 願天下有情人都是失散多年的兄妹

                      https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216

 

 

題目

呵呵。大家都知道五服以內不得通婚,即兩個人最近的共同祖先如果在五代以內(即本人、父母、祖父母、曾祖父母、高祖父母)則不可通婚。本題就請你幫助一對有情人判斷一下,他們究竟是否可以成婚?

輸入

輸入第一行給出一個正整數N(2 ≤ N ≤10​4​​),隨後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;
} 
 

 

相關文章