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 }