Cod sursa(job #2432112)

Utilizator stratonedanielDaniel Stratone stratonedaniel Data 22 iunie 2019 10:52:09
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <vector>


#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, vector<int> &levels, vector<int> &path)
{
	visited[node] = true;

	path.push_back(node);
	levels.push_back(level);

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

}

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

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

	}

	for (i = index; i < path.size(); i++)
	{
		minim = min(minim, levels.at(i));

		if (minim == levels.at(i))
		{
			goodIndex = i;
		}

		if (ok == 2 && path.at(i) == param1)
			break;

		if (ok == 1 && path.at(i) == param2)
			break;
	}


	return path.at(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];
	vector<int> levels;
	vector<int> path;

	read >> N >> M;

	int father;

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

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

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

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

	return 0;
}