Cod sursa(job #2432113)

Utilizator stratonedanielDaniel Stratone stratonedaniel Data 22 iunie 2019 10:58:47
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stdlib.h>

#define maxN 100001

using namespace std;

int min(int a, int b)
{
	if (a < b)
		return a;
	return b;
}

void DFS(vector<int> adjlist[], int node, int level, bool *visited, int *levels, int *path, int *size)
{
	visited[node] = true;
	(*size)++;

	path[*size - 1] = node;
	levels[*size - 1] = level;

	for(int i : adjlist[node])
		if (visited[i] == false)
		{
			DFS(adjlist, i, level + 1, visited, levels, path, size);
			
			(*size)++;
			path[*size - 1] = node;
			levels[*size - 1] = level;
		}

}

int LCA(int *levels, int *path, int size, int param1, int param2)
{
	int ok = 0;
	int index = -1;
	int minim = size + 1;
	int goodIndex = -1;
	int i;

	for (i = 0; i < size; i++)
	{
		if (path[i] == param1)
		{
			ok = 1;
			index = i;
			break;
		}
		else if (path[i] == param2)
		{
			ok = 2;
			index = i;
			break;
		}

	}

	for (i = index; i < size; i++)
	{
		minim = min(minim, levels[i]);

		if (minim == levels[i])
		{
			goodIndex = i;
		}

		if (ok == 2 && path[i] == param1)
			break;

		if (ok == 1 && path[i] == param2)
			break;
	}


	return path[goodIndex];
}

int main(int argc, char const *argv[])
{
	ifstream read("lca.in");
	ofstream write("lca.out");

	int N, M;

	bool visited[maxN];
	vector<int> adjlist[maxN];
	int* levels = (int *) calloc(2 * maxN, sizeof(int));
	int* path = (int *) calloc(2 * maxN, sizeof(int));

	read >> N >> M;

	int father;

	for(int i = 2; i <= N; ++i)
	{
		read >> father;
		adjlist[father].push_back(i);
	}

	int size = 0;
	DFS(adjlist, 1, 0, visited, levels, path, &size);
	
	int param1, param2;

	for (int i = 0; i < M ; i++)
	{
		read >> param1 >> param2;
		write << LCA(levels, path, size, param1, param2) << "\n";
	}

	free(path);
	free(levels);

	read.close();
	write.close();

	return 0;
}