测评记录:https://codeforces.com/problemset/submission/555/197903665
#include <bits/stdc++.h>
using namespace std;
namespace Milkcat {
const int N = 1e6 + 5;
struct edge {
int u, to, next;
} e[N << 1];
int n, m, q, u, v, tot, edge_cnt, cnt;
int lg[N], d1[N], d2[N], pwp[N], depth[N], dfn[N], low[N], bel[N], head[N], f[N][22];
bool cut[N << 1], vis[N];
vector<int> ans[N], G[N];
unordered_set<int> s[N];
void add(int u, int v) {
e[++ edge_cnt].to = v;
e[edge_cnt].u = u;
e[edge_cnt].next = head[u];
head[u] = edge_cnt;
}
void tarjan(int u, int in) {
dfn[u] = low[u] = ++ tot;
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].to;
if (!dfn[v]) tarjan(v, i), low[u] = min(low[u], low[v]);
else if (i != (in ^ 1)) low[u] = min(low[u], low[v]);
if (low[v] > dfn[u]) cut[i] = cut[i ^ 1] = 1;
}
}
void dfs(int u, int id) {
ans[id].push_back(u), bel[u] = id, vis[u] = 1;
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].to;
if (vis[v] || cut[i]) continue;
dfs(v, id);
}
}
void dfs1(int u, int fat) {
f[u][0] = fat, depth[u] = depth[fat] + 1;
for (int v : G[u]) if (v != fat) dfs1(v, u);
}
void dfs2(int u, int fat) {
for (int v : G[u])
if (v != fat) dfs2(v, u), d1[u] += d1[v], d2[u] += d2[v];
}
int LCA(int x, int y) {
if (depth[x] < depth[y]) swap(x, y);
while (depth[x] > depth[y])
x = f[x][lg[depth[x] - depth[y]]];
if (x == y) return x;
for (int i = 20; i >= 0; i --)
if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
return f[x][0];
}
int main() {
cin >> n >> m >> q, edge_cnt = 1;
for (int i = 2; i <= n; i ++) lg[i] = lg[i >> 1] + 1;
for (int i = 1; i <= m; i ++)
cin >> u >> v, add(u, v), add(v, u);
for (int i = 1; i <= n; i ++)
if (!dfn[i]) tarjan(i, 0);
for (int i = 1; i <= n; i ++)
if (!vis[i]) dfs(i, ++ cnt);
for (int i = 1; i <= edge_cnt; i ++) {
int u = bel[e[i].u], v = bel[e[i].to];
if (cut[i] && !s[u].count(v))
G[u].push_back(v), s[u].insert(v);
}
// for (int i = 1; i <= edge_cnt; i ++)
// if (cut[i]) cout << "qwq " << e[i].u << ' ' << e[i].to << '\n';
dfs1(1, 0);
for (int i = 1; i <= edge_cnt; i ++) {
if (!cut[i] || (i & 1)) continue;
int u = bel[e[i].u], v = bel[e[i].to];
if (depth[u] < depth[v]) swap(u, v);
pwp[u] ++;
}
for (int j = 1; j <= 20; j ++)
for (int i = 1; i <= n; i ++)
f[i][j] = f[f[i][j - 1]][j - 1];
// puts("----");
// for (int i = 1; i <= cnt; i ++) {
// for (int u : G[i]) cout << u << ' ';
// cout << '\n';
// }
// puts("----");
for (int i = 1; i <= q; i ++) {
cin >> u >> v;
int lca = LCA(bel[u], bel[v]);
// cout << bel[u] << ' ' << bel[v] << ' ' << lca << '\n';
d1[bel[u]] ++, d1[lca] --;
d2[bel[v]] ++, d2[lca] --;
}
dfs2(1, 0);
for (int i = 1; i <= n; i ++)
if (pwp[i] < bool(d1[i]) + bool(d2[i])) puts("No"), exit(0);
puts("Yes");
return 0;
}
}
int main() {
return Milkcat::main();
}