Pagini recente » Cod sursa (job #1616936) | Cod sursa (job #2195002) | Cod sursa (job #440859) | Cod sursa (job #486012) | Cod sursa (job #2432113)
#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;
}