Cod sursa(job #1732285)

Utilizator serbanmaria15Serban Maria-Catalina serbanmaria15 Data 21 iulie 2016 13:12:48
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<stdio.h>
#include<vector>
#define max 100001
#define h 300 // h inaltimea arborelui

int tata[max], stramos[max];
int n, m, nivel[max], x, y,i;
std::vector<int> fiu[max];

void dfs(int nod, int nod1,  int niv)
{
	int i;
	stramos[nod]=nod1;
	nivel[nod]=niv;
	if(niv % h == 0) //nu sunt pe ultimul nivel
		nod1=nod;
	for(i=0; i<fiu[nod].size(); i++) //pentru fiecare fiu i al nodului aplic dfs
		{
			dfs(fiu[nod][i], nod1, niv+1);
	    }
}

int LCA( int x, int y)
{
	//cat timp nodurile x si y nu au acelasi stramos
	//alegem nodul care e situat cel mai aproape de cel mai mic nivel
	while(stramos[x] != stramos[y]) 
	{
		if(nivel[x] > nivel[y])
			x=stramos[x];
		else
			y=stramos[y];
	}
	//sunt in aceeasi sectiune
	while(x != y)
	{
		if(nivel[x] > nivel[y])
			x=tata[x];
		else
			y=tata[y];
	}
	return x;
}

int main()
{
	FILE *inputFile, *outputFile;
	inputFile=fopen("lca.in", "r");
	outputFile=fopen("lca.out", "w");

	fscanf(inputFile, "%d %d", &n, &m);
	for(i=2; i<=n; i++)
	{
		fscanf(inputFile, "%d", &tata[i]);
		fiu[tata[i]].push_back(i);
	}

	dfs(1, 1, 0);
	for(i=1; i<=m; i++)
	{
		fscanf(inputFile, "%d %d", &x, &y);
		int lca=LCA(x,y);
		fprintf(outputFile, "%d\n",lca);
	}

	return 0;
}