题意及思路:链接
下面贴上我觉得好理解的代码,不同的地方是,一个环上必然有权值小的节点指向权值大的节点,权值大的节点指向权值小的节点,那么我输出的时候,如果指向的权值大就输出1,小就输出2。
#include <bits/stdc++.h>
#define mk make_pair
#define pi pair<int,int>
#define pb push_back
using namespace std;
const int maxn = 5100;
vector<pi>G[maxn];
int d[maxn],ans[maxn],n;
int ok()
{
queue<int>q;
for(int i=1;i<=n;i++)if(!d[i])q.push(i);
while(!q.empty())
{
int u = q.front();
q.pop();
for(auto it : G[u])
{
int v = it.first;
if(--d[v] == 0)q.push(v);
}
}
for(int i=1;i<=n;i++)if(d[i])return 0;
return 1;
}
int main()
{
int m,u,v;
cin>>n>>m;
for(int i = 1; i <= m; i++)
{
scanf("%d%d",&u,&v);
G[u].pb(mk(v,i));
d[v]++;
}
if(ok())
{
puts("1");
for(int i=1;i<=m;i++)cout<<"1 ";
return 0;
}
puts("2");
for(int i=1;i<=n;i++)
for(auto it : G[i])
{
int id = it.second;
int v = it.first;
if(ans[id])continue;
if(v < i)ans[id] = 1;
else ans[id] = 2;
}
for(int i=1;i<=m;i++)cout<<ans[i]<<' ';
return 0;
}