L2-016 Que todos los amantes del mundo sean hermanos y hermanas perdidos hace mucho tiempo (DFS)

enlace de tema

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

ideas

Consideramos esta relación familiar como un árbol binario, el nodo raíz del árbol es el elemento hijo, el "hijo izquierdo" es el padre y el "hijo derecho" es la madre, y luego definimos isman[i]isman[ i]i s m a n [ i ] Si lo es true, significa queidel género del número esmasculino, de lo contrario esfemenino, y luego cada vez que ingresamos una línea de datos, conectamos los bordes, el punto de partida es el actual número, el punto final es el número principal (si existe), y luego estamos enQCuando pregunte por segunda vez, primero determine si los dos números son del sexo opuesto, y luego usaremos el número actual como el número inicial punto para una longitud menor o igual a5 5Todos los puntos setde 5set se ponen en uno, y el otro es igual, solo necesitamos atravesar uno de ellos ysetaveriguar si hay un elemento actual en el otro para determinar si hay una intersección dentro de 5 generaciones. no hay intersección, luego salidaYesotra salidaNo

código

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f

const int N = 1e5+10;

int n,q;
vector<int> V[N];
bool isman[N];

void dfs(int id,int deep,set<int> &ans) {
    
    
	if(deep == 6) return;
	ans.insert(id);
	for(auto it : V[id])
		dfs(it,deep + 1,ans);
}

void slove(int l,int r){
    
    
	if(isman[l] == isman[r]){
    
    
		cout<<"Never Mind"<<endl;
		return;
	}
	set<int> S1,S2;
	dfs(l,1,S1);
	dfs(r,1,S2);
	bool fg = false;
	for(auto it : S1){
    
    
		if(S2.find(it) != S2.end()) {
    
    
			fg = true;
			break;
		}
	}
	if(fg)	cout<<"No"<<endl;
	else cout<<"Yes"<<endl;
}

int main()
{
    
    
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	int id,fa,ma;
	char sex;
	for(int i = 1;i <= n; ++i) {
    
    
		cin>>id>>sex>>fa>>ma;
		if(fa + 1) V[id].push_back(fa),isman[fa] = true;
		if(ma + 1) V[id].push_back(ma);
		if(sex == 'M') isman[id] = true;
		else isman[id] = false;
	}
	cin>>q;
	int l,r;
	while(q--) {
    
    
		cin>>l>>r;
		slove(l,r);
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/m0_46201544/article/details/123963285
Recomendado
Clasificación