P4201代码求调
#pragma GCC octimize("02")
#include <iostream>
#include <vector>
using namespace std;
int n, m, q;
vector<int> e[100010];
int f[100010][3], g[100010][3][20];
void dfs(int x, int fa)
{
for (auto y : e[x])
{
if (fa == y) continue;
dfs(y, x);
f[x][2] = min(max(f[x][2], f[y][2] + 1), max(f[x][1], f[x][1]));
f[x][1] = min(max(f[x][1], f[y][2] + 1), max(f[x][0], f[y][1]));
f[x][0] = max(f[x][0], f[y][2] + 1);
}
}
void dfs2(int x, int fa)
{
for (int i = 1; i <= f[1][2]; ++i)
for (int j = 0; j < 3; ++j) g[x][j][i + 1] = 1;
for (auto y : e[x])
{
if (fa == y) continue;
dfs2(y, x);
for (int i = 1; i <= f[1][2]; ++i)
{
g[x][2][i] = g[x][2][i] * g[y][2][i - 1] + g[x][1][i] * g[y][1][i];
g[x][1][i] = g[x][1][i] * g[x][2][i - 1] + g[x][0][i] * g[y][1][i];
g[x][0][i] = g[x][0][i] * g[y][2][i - 1];
}
}
}
int main()
{
cin >> n >> m >> q;
for (int i = 1; i <= m; ++i)
{
int u, v;
cin >> u >> v;
e[u].push_back(v);
}
dfs(1, 0);
cout << f[1][2] << ' ' << g[1][2][f[1][2]] << endl;
return 0;
}