Pagini recente » Cod sursa (job #2712466) | Cod sursa (job #1055320) | Cod sursa (job #1296219) | Cod sursa (job #162944) | Cod sursa (job #3041777)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
const int NMAX = 100000;
vector<int> graf[1 + NMAX];
bool areSef[1 + NMAX];
int dp[1 + NMAX];
/// dp[i] = timpul minim necesar pentru ca subarborele cu radacina in i sa fie complet anuntat
/// din momentul in care nodul i a fost anuntat.
void dfs(int nod)
{
vector<int> timpFii;
/// Nu trebuie vector de vizitat, pentru ca graful e orientat.
for (int i = 0; i < graf[nod].size(); i++)
{
dfs(graf[nod][i]);
timpFii.push_back(dp[graf[nod][i]]);
}
sort(timpFii.begin(), timpFii.end());
int maxim = 0;
int delay = 1;
for (int i = timpFii.size() - 1; i >= 0; i--)
{
maxim = max(maxim, timpFii[i] + delay);
delay++;
}
dp[nod] = maxim;
}
int main()
{
ifstream in("zvon.in");
ofstream out("zvon.out");
ios_base::sync_with_stdio(false);
in.tie(nullptr);
int t;
in >> t;
while (t--)
{
int n;
in >> n;
for (int i = 1; i <= n; i++)
{
dp[i] = 0;
areSef[i] = false;
graf[i].clear();
}
for (int i = 1; i <= n - 1; i++)
{
int a, b;
in >> a >> b;
graf[a].push_back(b);
areSef[b] = true;
}
int sef = -1;
for (int i = 1; i <= n; i++)
{
if (!areSef[i])
{
sef = i;
dfs(sef);
break;
}
}
out << dp[sef] << '\n';
}
in.close();
out.close();
return 0;
}