이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
typedef long long llong;
const int MAXN = 300000 + 10;
const int INF = 2e9;
int n, q;
int parent[MAXN];
int in[MAXN], out[MAXN], timer;
int begin[MAXN], end[MAXN];
std::vector <int> g[MAXN];
std::vector <int> v[MAXN];
int from[MAXN], to[MAXN];
void initDFS(int node, int p)
{
parent[node] = p;
in[node] = ++timer;
for (const int &i : g[node])
{
if (i == p) continue;
initDFS(i, node);
}
out[node] = ++timer;
}
inline bool inSubtree(int x, int y)
{
return in[y] <= in[x] && out[x] <= out[y];
}
void cyclePath(int start, int finish, int num)
{
if (inSubtree(start, finish))
{
if (begin[start] != 0 && begin[start] != num)
{
v[num].push_back(begin[start]);
}
if (end[start] != 0 && end[start] != num)
{
v[end[start]].push_back(num);
}
if (start != finish) cyclePath(parent[start], finish, num);
} else
{
if (begin[finish] != 0 && begin[finish] != num)
{
v[num].push_back(begin[finish]);
}
if (end[finish] != 0 && end[finish] != num)
{
v[end[finish]].push_back(num);
}
cyclePath(start, parent[finish], num);
}
}
int vis[MAXN];
bool findCycle(int node)
{
vis[node] = 1;
for (const int &i : v[node])
{
if (vis[i] == 2) continue;
if (vis[i] == 1) return true;
if (findCycle(i)) return true;
}
vis[node] = 2;
return false;
}
void solve()
{
initDFS(1, 0);
for (int i = 1 ; i <= q ; ++i)
{
if (from[i] == to[i]) continue;
cyclePath(from[i], to[i], i);
}
for (int i = 1 ; i <= q ; ++i)
{
if (vis[i] == 2) continue;
if (findCycle(i))
{
std::cout << "No\n";
return;
}
}
std::cout << "Yes\n";
}
void read()
{
int x, y;
std::cin >> n;
for (int i = 2 ; i <= n ; ++i)
{
std::cin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
std::cin >> q;
for (int i = 1 ; i <= q ; ++i)
{
std::cin >> from[i] >> to[i];
begin[from[i]] = i;
end[to[i]] = i;
}
}
void reset()
{
for (int i = 1 ; i <= std::max(n, q) ; ++i)
{
g[i].clear();
v[i].clear();
begin[i] = 0;
end[i] = 0;
vis[i] = 0;
timer = 0;
}
}
void fastIO()
{
std::ios_base :: sync_with_stdio(0);
std::cout.tie(nullptr);
std::cin.tie(nullptr);
}
int tests;
int main()
{
fastIO();
std::cin >> tests;
while (tests--)
{
reset();
read();
solve();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |