• 【题解】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;
    }
    
    
  • 相关阅读:
    eclipse如何添加User Library
    Json字符串取值
    日常发现的小工具
    java获取json数组格式中的值
    每日总结一个面试题
    linux下备份还原mysql某个库(完整版)
    linux下安装zookeeper教程
    redis安装及常用命令
    dubbo-admin安装使用
    前端框架 一周使用经验积累
  • 原文地址:https://www.cnblogs.com/winlere/p/12313958.html
Copyright © 2020-2023  润新知