Ho provato a risolvere il problema usando una DSU. Mi da errati solo alcuni testcase dove va fuori tempo ma per il resto non supera mai i 100ms quindi non riesco a capire se sia un problema di qualche edge case oppure proprio di approccio.
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
using namespace std;
int parent[100000];
int root(int a)
{
if (a == parent[a])
return a;
return parent[a] = root(parent[a]);
}
void connect(int a, int b)
{
a = root(a);
b = root(b);
if (a != b)
parent[a] = b;
}
int visita(int N, int M, int K, vector<int> boot, vector<int> A, vector<int> B, vector<int> Exp)
{
int time = 0, available = K;
set<int> vis;
for (int i = 0; i < N; i++)
parent[i] = i;
vector<vector<pair<int, int>>> edges(K+1);
for (int i = 0; i < M; i++)
{
time = max(time, Exp[i]);
edges[Exp[i]].push_back({A[i], B[i]});
}
for (int i = 0; i < K; i++)
{
vis.insert(boot[i]);
}
for (int i = time; i >= 1; i--)
{
for (auto [a, b] : edges[i])
connect(a, b);
for (int v : vis)
{
if (root(v) == root(0))
{
available--;
vis.erase(v);
break;
}
}
}
return K - available;
}