Pagini recente » Cod sursa (job #530022) | Cod sursa (job #1511795) | Cod sursa (job #3129248) | Cod sursa (job #1914210) | Cod sursa (job #1605218)
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>
#define ll long long int
#define N 8192
using namespace std;
ifstream f("felinare.in");
ofstream g("felinare.out");
ll n,m,i,j,k,x,y,p,ip,rasp,ok,a,b,c,ur,ce,dp[N][4];
vector<int> v[N],w[N];
vector<pair<int,pair<int,int> > > si;
bitset<N*N> mark;
void doit(vector<int> v,int nod,int t)
{
for (j=0;j<v.size();++j)
{
ur = v[j];
ce = nod*N+ur ;
if (mark[ce])
break;
}
if (j == v.size())
{
for (j=0;j<v.size();++j)
{
ur = v[j];
ce = nod*N+ur ;
mark[ce] = 1;
ce = nod + ur*N;
mark[ce] = 1;
}
dp[nod][t]=1;
}
}
int main()
{
f>>n>>m;
for(i=1;i<=m;++i)
{
f>>x>>y;
v[x].push_back(y);
w[y].push_back(x);
}
for(i=1;i<=n;++i)
si.push_back({v[i].size(),{i,1}}),
si.push_back({w[i].size(),{i,2}});
sort(si.begin(),si.end());
for (i=0;i<si.size();++i)
{
a=si[i].first;
b=si[i].second.first;
c=si[i].second.second;
if (c==1)
{
doit(v[b],b,c);
}
else doit(w[b],b,c);
}
int r=0;
for(i=1;i<=n;++i)
{
if (dp[i][1] && dp[i][2])
dp[i][0]=3,r+=2;
else if (dp[i][1])
dp[i][0]=1,r+=1;
else if (dp[i][2])
dp[i][0]=2,r+=1;
}
g<<r<<'\n';
for (i=1;i<=n;++i)
g<<dp[i][0]<<'\n';
return 0;
}