【题解】AGC027C ABland Yard (dfs+构造)

【题解】AGC027C ABland Yard (dfs+构造)

因为可以表示出无限的串,所以肯定在走环。考虑这个环的性质,在任意一个点有同色点和不同色点相连。但这样的概念太大了,考虑缩小一下条件,考虑极小的满足条件的环的特征。

可以发现环构成的路径一定是AABB.AABB.......的形式,也就是存在一个同色点(可以重点)走恰好两次第三次必到不同色点的环。对于每个点化为两种点in点和out点,对于端点同色的边in->out连边,不同色的out->in连边。可以发现在这张新图上任何一个环都是满足条件的极小环,dfs判环即可。

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std; typedef long long ll;
inline int qr(){
	int ret=0,f=0,c=getchar();
	while(!isdigit(c)) f|=c==45,c=getchar();
	while( isdigit(c)) ret=ret*10+c-48,c=getchar();
	return f?-ret:ret;
}
const int maxn=2e5+5;
int n,m;
char w[maxn];
vector<int> e[maxn<<1];
int usd[maxn<<1];
void add(int fr,int to){e[fr].push_back(to);}

void dfs(int now,int last){
	usd[now]=1;
	for(auto t:e[now])
		if(t^last){
			if(!usd[t]) dfs(t,now);
			else if(usd[t]!=-1) puts("Yes"),exit(0);
		}
	usd[now]=-1;
}

int main(){
	n=qr(); m=qr();
	scanf("%s",w+1);
	for(int t=1,a,b;t<=m;++t){
		a=qr(),b=qr();
		if(w[a]!=w[b]) add(a,b+n),add(b,a+n);
		else add(a+n,b),add(b+n,a);
	}
	for(int t=1;t<=n+n;++t)
		if(!usd[t]) dfs(t,0);
	puts("No");
	return 0;
}

posted @ 2020-02-15 21:47  谁是鸽王  阅读(209)  评论(0编辑  收藏  举报