CF547D Mike and Fish 欧拉回路

题意:

戳这里

分析:

首先我们将题意转化,把行和列当做点,而每一个棋子,则是行和列之间的一条边,然后我们给边进行定向,使得每一个点的入度和出度的差值的绝对值不超过一

相当于在有向图上跑欧拉回路

代码:

#include<bits/stdc++.h>

using namespace std;

namespace zzc
{
	inline int read()
	{
		int x=0,f=1;char ch=getchar();
		while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
		while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
		return x*f;
	}
	
	const int maxn = 200000;
	int head[maxn*2+5],deg[maxn*2+5];
	int n,cnt=1;
	bool vis[maxn*4+5],ans[maxn*2+5];
	
	struct edge
	{
		int to,nxt;
	}e[maxn*4];
	
	void add(int u,int v)
	{
		e[++cnt].to=v;
		e[cnt].nxt=head[u];
		head[u]=cnt;
		deg[v]++;
	}
	
	void dfs(int u)
	{
		for(int &i=head[u],tmp;i;i=e[i].nxt)
		{
			if(!vis[tmp=(i>>1)])
			{
				vis[tmp]=true;
				if(tmp<=n) ans[tmp]=i&1;
				else ans[tmp]=0;
				dfs(e[i].to);
			}
		}
	}
	
	void work()
	{
		int x,y;
		n=read();
		for(int i=1;i<=n;i++)
		{
			x=read();y=read();
			add(x,y+maxn);add(y+maxn,x);
		}
		for(int i=1;i<=(maxn<<1);i++) if(deg[i]&1) add(0,i),add(i,0);
		for(int i=1;i<=(maxn<<1);i++) dfs(i);
		for(int i=1;i<=n;i++) putchar(ans[i]?'b':'r');
	}

}

int main()
{
	zzc::work();
	return 0;
}

posted @ 2020-11-26 14:36  youth518  阅读(70)  评论(0编辑  收藏  举报