• Codeforces 547D Mike and Fish


    Description

    题面
    题目大意:有一个的网格图,给出其中的 (n) 个点,要你给这些点染蓝色或红色,满足对于每一行每一列都有红蓝数量的绝对值之差不超过1

    Solution

    首先建立二分图,点((x,y))视作 (x->y') 的一条边
    问题转化为:给边染色,使得每一个点的两种颜色的数量之差不超过(1)

    如果原图存在欧拉回路,那么沿着欧拉回路交替染色即可(因为一定是偶环)
    但是实际上存在度数为奇数的点,不能够成欧拉回路,所以我们先把它变成欧拉回路

    容易发现度数为奇数的点的数量是偶数,那么我们新加一些边,使得奇数点两两匹配连边,那么度数就变成了偶数
    然后我们发现这样原图就不一定是二分图了,有可能存在奇环(只有起始点会矛盾)

    我们先把度数为奇数的点遍历掉,如果没有被遍历到的就都是偶环了,黑白染色肯定符合要求,我们可以直接丢掉

    实际上我们只需要从新加入的边开始找欧拉回路就行了,因为这条边实际上是废边
    如何证明正确性?
    因为矛盾的情况一定是起始点存在某种颜色多了(1),而废边正好把这个多了的给消除了,所以是合法的

    注意:找欧拉回路时,走过的边就可以不走了,那么就可以从邻接表上直接删除,不然复杂度会出问题

    #include<bits/stdc++.h>
    using namespace std;
    const int N=400400,M=2e5;
    int n,head[N],nxt[N<<1],to[N<<1],num=1,in[N],q[N],top=0,tot;
    bool vis[N],ans[N],v[N<<1];int id[N<<1];
    inline void link(int x,int y,int ID)
    {nxt[++num]=head[x];to[num]=y;head[x]=num;id[num]=ID;}
    inline void dfs(int x){
    	vis[x]=1;
    	int i;
    	while(head[x]){
    		i=head[x];
    		head[x]=nxt[i];
    		if(v[i])continue;
    		v[i^1]=1,dfs(to[i]);
    		q[++top]=id[i];
    	}
    }
    int main(){
    	int x,y;
    	scanf("%d",&n);tot=M<<1;
    	for(int i=1;i<=n;i++){
    		scanf("%d%d",&x,&y);
    		link(x,y+M,i);link(y+M,x,i);
    		in[x]++;in[y+M]++;
    	}
    	static int lis[N],cnt=0;
    	for(int i=1;i<=tot;i++)if(in[i]&1)lis[++cnt]=i;
    	for(int i=1;i<=cnt;i+=2)link(lis[i],lis[i+1],0),link(lis[i+1],lis[i],0);
    	bool c=0;
    	for(int i=1;i<=cnt;i++){
    		if(!vis[lis[i]]){
    			dfs(lis[i]);c=0;
    			while(top){
    				c^=1;
    				if(q[top])ans[q[top]]=c;
    				q[top--]=0;
    			}
    		}
    	}
    	for(int i=1;i<=tot;i++){
    		if(!vis[i]){
    			dfs(i);c=0;
    			while(top){
    				c^=1;
    				if(q[top])ans[q[top]]=c;
    				q[top--]=0;
    			}
    		}
    	}
    	for(int i=1;i<=n;i++)printf("%c",ans[i]?'r':'b');
    	return 0;
    }
    
    
  • 相关阅读:
    爱情的诗·1~5节
    人生的诗·381~385节
    人生的诗·375~380节
    python数据类型初始1
    python编码知识初始_ASCII码,Unicode,Utf-8,GBK
    Python运算符,逻辑运算
    python格式化输出%,while else
    pycharm使用教程链接+部分练习题01
    python流程控制-条件语句If,while循环
    python基础数据类型初始,用户交互
  • 原文地址:https://www.cnblogs.com/Yuzao/p/8485991.html
Copyright © 2020-2023  润新知