zoukankan      html  css  js  c++  java
  • 【题解】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;
    }
    
    
  • 相关阅读:
    【成本管理】成本核算
    CW23:Work Log
    SQLSERVER数据库连接
    Oracle 创建用户 修改用户密码 授权命令
    CW24:WORK LOG
    ORA12560: TNS: 协议适配器错误的解决方法
    需求工程概述
    日语学习1:送气音和不送气音
    junit测试框架简单应用
    Java之Socket编程
  • 原文地址:https://www.cnblogs.com/winlere/p/12313958.html
Copyright © 2011-2022 走看看