1. 程式人生 > 實用技巧 >CF547D Mike and Fish 歐拉回路

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;
}