https://codeforces.com/problemset/problem/1217/D
如果无环,那么就是1
如果有环,答案就是2,对于u<v的边,颜色是1,u>v的颜色是2,这样就不会有同色环了
#include<bits/stdc++.h>
#define maxl 300010
using namespace std;
int n,m,ans,cnt;
int a[maxl],du[maxl],tp[maxl],ehead[maxl];
char s[maxl];
struct ed
{
int u,to,nxt;
}e[maxl];
vector <int> ee[maxl];
queue <int> q;
inline void add(int u,int v)
{
e[++cnt].to=v;e[cnt].u=u;e[cnt].nxt=ehead[u];
ehead[u]=cnt;
}
inline void prework()
{
cnt=0;
scanf("%d%d",&n,&m);
int u,v;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);du[v]++;
}
}
inline void mainwork()
{
for(int i=1;i<=n;i++)
if(!du[i])
q.push(i);
int u,v;
while(!q.empty())
{
u=q.front();q.pop();
for(int i=ehead[u];i;i=e[i].nxt)
{
v=e[i].to;
du[v]--;
if(du[v]==0)
q.push(v);
}
}
bool flag=true;
for(int i=1;i<=n;i++)
if(du[i]!=0)
flag=false;
if(flag)
{
ans=1;
return;
}
ans=2;
}
inline void print()
{
if(ans==1)
{
puts("1");
for(int i=1;i<=m;i++)
printf("1 ");
}
else
{
puts("2");
for(int i=1;i<=m;i++)
if(e[i].u<e[i].to)
printf("1 ");
else
printf("2 ");
}
}
int main()
{
int t=1;
//scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}