time limit per test : 1 second
memory limit per test : 256 megabytes
分数:2000
You are given a directed graph with
n
n
n vertices and
m
m
m directed edges without self-loops or multiple edges.
Let’s denote the
k
k
k-coloring of a digraph as following: you color each edge in one of
k
k
k colors. The
k
k
k-coloring is good if and only if there no cycle formed by edges of same color.
Find a good
k
k
k-coloring of given digraph with minimum possible
k
k
k.
Input
The first line contains two integers
n
n
n and
m
(
2
≤
n
≤
5000
,
1
≤
m
≤
5000
)
m (2≤n≤5000, 1≤m≤5000)
m(2≤n≤5000,1≤m≤5000) — the number of vertices and edges in the digraph, respectively.
Next
m
m
m lines contain description of edges — one per line. Each edge is a pair of integers
u
u
u and
v
(
1
≤
u
,
v
≤
n
,
u
v(1≤u,v≤n, u
v(1≤u,v≤n,u≠
v
)
v)
v) — there is directed edge from
u
u
u to
v
v
v in the graph.
It is guaranteed that each ordered pair
(
u
,
v
)
(u,v)
(u,v) appears in the list of edges at most once.
Output
In the first line print single integer k k k— the number of used colors in a good k k k-coloring of given graph.
In the second line print
m
m
m integers
c
1
,
c
2
,
…
,
c
m
(
1
≤
c
i
≤
k
)
c_1,c_2,…,c_m (1≤c_i≤k)
c1,c2,…,cm(1≤ci≤k), where ci is a color of the
i
i
i-th edge (in order as they are given in the input).
If there are multiple answers print any of them (you still have to minimize
k
k
k).
Examples
Input
4 5
1 2
1 3
3 4
2 4
1 4
Outpu
1
1 1 1 1 1
Input
3 3
1 2
2 3
3 1
Output
2
1 1 2
题意:
给一个有向图,给每条边染色,使得每种颜色的边不能构成环。求一种染色种数最少的方案。
题解:
最多只会染上2种颜色
考虑dfs,每次出现返祖边的时候返祖边的颜色就是第二种颜色,否则的话全是第一种颜色。
那么只要dfs即可。
#include<bits/stdc++.h>
#define ll long long
#define pa pair<int,int>
using namespace std;
int n,m;
vector<pa>G[5004];
int ans[5004];
bool flag,vis[5004],inq[5004];
void dfs(int x){
inq[x]=1;
vis[x]=1;
for(pa now:G[x]){
int to=now.first,s=now.second;
ans[s]=1;
if(!vis[to]){
dfs(to);
}
else if(inq[to]){
ans[s]=2;
flag=1;
}
else{
ans[s]=1;
}
}
inq[x]=0;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v;scanf("%d%d",&u,&v);
G[u].push_back({v,i});
}
flag=0;
for(int i=1;i<=n;i++){
if(!vis[i])dfs(i);
}
if(!flag){
printf("%d\n",1);
for(int i=1;i<=m;i++){
printf("%d ",ans[i]);
}
puts("");
}
else{
printf("%d\n",2);
for(int i=1;i<=m;i++){
printf("%d ",ans[i]);
}
puts("");
}
return 0;
}