【题解】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;
}
博客保留所有权利,谢绝学步园、码迷等不在文首明显处显著标明转载来源的任何个人或组织进行转载!其他文明转载授权且欢迎!