记录编号 261759 评测结果 AAAAAAAAAA
题目名称 [HZOI 2015]地牢里的背叛 最终得分 100
用户昵称 Gravatar神利·代目 是否通过 通过
代码语言 C++ 运行时间 0.418 s
提交时间 2016-05-18 16:23:17 内存使用 37.59 MiB
显示代码纯文本
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define maxn 200010
using namespace std;
inline void in(int&x){for(x=getchar();x<48|x>57;x=getchar());x^=48;for(int tmp=getchar();47<tmp&tmp<58;tmp=getchar())x=(x<<1)+(x<<3)+(tmp^48);}
int n,m,Q,num,cnt,ti;
int sn[maxn],fa[maxn][20],sta[maxn],bn[maxn][2],c1[maxn],c2[maxn],bg[maxn],Rt[maxn],dfn[maxn],low[maxn];
bool fg=1,vis[maxn],ins[maxn];
int shu=1,first[maxn];
struct edge{int u,v,nx;}o[maxn<<1],st[maxn<<1];
inline void add(int u,int v){o[++shu].u=u,o[shu].v=v,o[shu].nx=first[u],first[u]=shu;}
inline void tarjan(int x,int f){
	low[x]=dfn[x]=++num;
	sta[++sta[0]]=x,ins[x]=1;
	for(int i=first[x];i;i=o[i].nx){
		if(i==(f^1))continue;
		if(!dfn[o[i].v]){
			tarjan(o[i].v,i);
			low[x]=min(low[x],low[o[i].v]);
		}else if(ins[o[i].v])low[x]=min(low[x],dfn[o[i].v]);
	}
	if(low[x]==dfn[x]){
		int now;++cnt;
		do{
			now=sta[sta[0]--];
			ins[now]=0,bg[now]=cnt;
		}while(now!=x);
	}
}
inline void dfs(int x,int f,int rt,int dep){
	sn[x]=dep,Rt[x]=rt;
	fa[x][0]=f;
	vis[x]=1;
	for(int i=1;(1<<i)<=sn[x];++i)fa[x][i]=fa[fa[x][i-1]][i-1];
	for(int i=first[x];i;i=o[i].nx){
		if(o[i].v==f||vis[o[i].v])continue;
		dfs(o[i].v,x,rt,dep+1);
	}
}
inline int LCA(int x,int y){
	if(sn[x]<sn[y])swap(x,y);
	for(int i=19;~i;--i)if(sn[fa[x][i]]>=sn[y])x=fa[x][i];
	if(x==y)return x;
	for(int i=19;~i;--i)if(sn[fa[x][i]]!=sn[fa[y][i]])x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
inline void dfs1(int x,int f){
	++ti,vis[x]=1;
	for(int i=first[x];i;i=o[i].nx){
		if(o[i].v==f||vis[o[i].v])continue;
		dfs1(o[i].v,x);
		c1[x]+=c1[o[i].v],c2[x]+=c2[o[i].v];
	}
	if(x&&c1[x]>0&&c2[x]>0)fg=0;
}
int main(){
	freopen("MM.in","r",stdin);
	freopen("MM.out","w",stdout);
	in(n),in(m),in(Q);
	for(int i=1,u,v;i<=m;++i)in(u),in(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<=Q;++i)in(bn[i][0]),in(bn[i][1]);
	memcpy(st,o,sizeof(o));
	int shu1=shu;shu=0;
	memset(first,0,sizeof(first));
	for(int i=1;i<=shu1;++i)if(bg[st[i].u]!=bg[st[i].v])add(bg[st[i].u],bg[st[i].v]);
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=cnt;++i)if(!vis[i])dfs(i,i,i,1);
	for(int i=1;i<=Q;++i){
		if(Rt[bg[bn[i][0]]]!=Rt[bg[bn[i][1]]]){
			fg=0;break;
		}
		int x=bg[bn[i][0]],y=bg[bn[i][1]];
		if(x==y)continue;
		int lca=LCA(x,y);
		++c1[x],--c1[lca];
		++c2[y],--c2[lca];
	}
	if(fg){
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=cnt;++i)if(!vis[Rt[i]])dfs1(Rt[i],Rt[i]);
	}
	if(!fg)puts("No");
	else puts("Yes");
	//while(1);
}