K. LED-led Paths

LED-led Paths

题目链接http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2314

Time Limit: 3 Sec Memory Limit: 512 Mb

Description

In a large city there are n junctions and m one-way streets connecting those junctions. It is known that one can’t walk along the streets infinitely, as there is no directed cycle of streets in the city.

The tourism department has decided to install colored illumination using the LED (light-emitting diode) technology. Each street is to be illuminated with either red ®, green (G), or blue (B) color.

The official city maps for tourists will indicate the selected colors. All continuous paths illuminated by the same color will be suggested for walking and sightseeing. As LEDs will lead people along beautiful ways, these paths will be called LED-led paths.

The health department says that if there is a very long single-color LED-led path, some tourists might overestimate their strength, walk for too long, get too tired, and dislike the city.

Propose a three-color illumination plan in which no single-color LED-led path consists of more than 42 streets.

Input

The first line of the input contains two integers n and m — the number of junctions and streets, respectively (2 ≤ n ≤ 50 000; 1 ≤ m ≤ 200 000).

Each of the following m lines contains two integers ui and vi, denoting a one-way street from junction ui to junction vi (1 ≤ ui, vi ≤ n; ui ≠ vi).

The given city is guaranteed to be acyclic. Each pair of junctions is connected by at most one street.

Output

For each street, in the order of input, output its color on a separate line — a single letter R, G, or B.

Sample Input

5 6
5 3
3 1
1 2
2 4
5 2
3 4

Sample Output

B
R
G
R
B
G

Hint
In this example, all single-color LED-led paths are not longer than one street (and therefore not longer than 42 streets), which is absolutely OK according to the health department.


题目大意:给每个街道染色,其中规定不得有连续超过42条街道是同一种颜色,你只有R,G,B三种颜色。
给你n,m(街道数和相连的数目)

。。。这题倒不是蒟蒻的我做的,我也就只能刷刷前面的几题水题。。。
就直接贴代码了。。。。

#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=5e4+5, maxm=2e5+5;
int n,m;
char clr[3]= {'R','B','G'};
int tot,go[maxm],fro[maxm],nxt[maxm],f1[maxn],com[maxn];
void ins(int x,int y) {
	go[++tot]=y;
	fro[tot]=x;
	nxt[tot]=f1[x];
	f1[x]=tot;
	com[y]++;
}
int d[maxn],dis[maxn];
void topo() {
	int j=0;
	fo(i,1,n) if (!com[i]) {
		d[++j]=i;
		dis[i]=1;
	}
	for(int i=1; i<=j; i++) {
		for(int p=f1[d[i]]; p; p=nxt[p]) {
			dis[go[p]]=max(dis[go[p]],dis[d[i]]+1);
			if (--com[go[p]]==0) d[++j]=go[p];
		}
	}
}
int main() {
	scanf("%d %d",&n,&m);
	fo(i,1,m) {
		int x,y;
		scanf("%d %d",&x,&y);
		ins(x,y);
	}
	topo();
	fo(i,1,m) {
		int w=0;
		for(int x=dis[fro[i]]^dis[go[i]]; x; x>>=1, w++);
		printf("%c\n",clr[w%3]);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值