rt,玄关
code:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
struct sb{
int nx,to;
}e[N*2],e2[N*2];
int down[N],up[N],h[N],idx,h2[N],idx2,low[N],dfn[N],n,m,k,sc,fl[N*2],jld[N],hscc,dep[N],f[N][25],scc[N];
void add(int x,int y){
e[++idx].to=y;
e[idx].nx=h[x];
h[x]=idx;
}
void add2(int x,int y){
e2[++idx2].to=y;
e2[idx2].nx=h2[x];
h2[x]=idx2;
}
void tarjan(int u,int dad){
dfn[u]=low[u]=++sc;
for(int i=h[u]; i; i=e[i].nx){
int v=e[i].to;
if(v==dad)continue;
if(!dfn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u])fl[i]=fl[i^1]=1;
}
else low[u]=min(low[u],dfn[v]);
}
}
void dfs_bs(int u,int h_s){
jld[u]=h_s;
for(int i=h[u]; i; i=e[i].nx){
int v=e[i].to;
if(jld[v]||fl[i])continue;
dfs_bs(v,h_s);
}
}
void dfs_lca(int u,int fa){
dep[u]=dep[fa]+1,scc[u]=sc,f[u][0]=fa;
for(int k=1; k<=20; k++)
f[u][k]=f[f[u][k-1]][k-1];
for(int i=h2[u]; i; i=e2[i].nx){
int v=e2[i].to;
if(v==fa)continue;
dfs_lca(v,u);
}
}
int lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
for(int i=20; i>=0; i--)
if(dep[f[x][i]]>=dep[y])
x=f[x][i];
if(x==y)return y;
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];
}
bool check(int u,int fa){
for(int i=h2[u]; i; i=e2[i].nx){
int v=e2[i].to;
if(fa==v)continue;
if(!check(v,u)||(down[v]&&up[v]))
return 0;
down[u]+=down[v];
up[u]+=up[v];
}
return 1;
}
signed main(){
cin>>n>>m>>k;
for(int i=1; i<=m; i++){
int u,v;
scanf("%d%d",&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(!jld[i])dfs_bs(i,++hscc);
for(int i=1; i<=n; i++){
for(int j=h[i]; j; j=e[j].nx){
int v=e[j].to;
if(jld[i]<jld[v])add2(jld[i],jld[v]),add2(jld[v],jld[i]);
}
}sc=0;
for(int i=1; i<=hscc; i++)if(!scc[i])sc++,dfs_lca(i,0);
for(int i=1; i<=k; i++){
int u,v;
scanf("%d%d",&u,&v);
u=jld[u],v=jld[v];
if(u==v)continue;
if(scc[u]!=scc[v]){
cout<<"No";
return 0;
}
int d=lca(u,v);
up[u]++,down[v]++;
down[d]--,up[d]--;
}
for(int i=1; i<=hscc; i++){
if(!f[i][0]&&!check(i,0)){
cout<<"No";
return 0;
}
}
cout<<"Yes";
return 0;
}