http://codeforces.com/problemset/problem/1217/D
这题的思路是构造,我们可以知道颜色最多只需要两种,然后按照dfs的顺序。

1 #include<bits/stdc++.h>
2 using namespace std;
3 int const N=5000+10;
4 struct edge{
5 int to,nt,id;
6 }e[N];
7 int cnt,h[N],c[N],check,n,m,ans[N];
8 void add(int a,int b,int c){
9 e[++cnt].to=b; e[cnt].id=c; e[cnt].nt=h[a]; h[a]=cnt;
10 }
11 void dfs(int x){
12 c[x]=1;
13 for(int i=h[x];i;i=e[i].nt){
14 int v=e[i].to;
15 if(!c[v]){
16 dfs(v);
17 ans[e[i].id]=1;
18 }else if(c[v]==2){
19 ans[e[i].id]=1;
20 }else {
21 ans[e[i].id]=2;
22 check=1;
23 }
24 }
25 c[x]=2;
26 }
27 int main(){
28 scanf("%d%d",&n,&m);
29 for(int i=1;i<=m;i++){
30 int x,y;
31 scanf("%d%d",&x,&y);
32 add(x,y,i);
33 }
34 for(int i=1;i<=n;i++)
35 if(!c[i]) dfs(i);
36 if(check) printf("2\n");
37 else printf("1\n");
38 for(int i=1;i<=m;i++)
39 printf("%d ",ans[i]);
40 return 0;
41 }
