Pagini recente » Cod sursa (job #78785) | Cod sursa (job #2270910) | Cod sursa (job #3128038) | Cod sursa (job #2228707) | Cod sursa (job #2518928)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("felinare.in");
ofstream fout("felinare.out");
const int NMAX = 8191;
const int MMAX = 20000;
struct ev
{
int val, ind, tip;
bool operator < (const ev other) const
{
return val < other.val;
}
};
int N, M;
int inDeg[NMAX + 5], outDeg[NMAX + 5];
vector <int> inEdges[NMAX + 5];
vector <int> outEdges[NMAX + 5];
bool visEdge[MMAX + 5];
vector <ev> v;
int ans;
bool f[NMAX + 5], s[NMAX + 5];
int main()
{
fin >> N >> M;
for(int i = 1; i <= M; i++)
{
int x, y;
fin >> x >> y;
outDeg[x]++, inDeg[y]++;
outEdges[x].push_back(i);
inEdges[y].push_back(i);
}
for(int i = 1; i <= N; i++)
{
v.push_back({inDeg[i], i, 1});
v.push_back({outDeg[i], i, 0});
}
sort(v.begin(), v.end());
for(auto it : v)
if(it.val == 0)
{
if(it.tip == 1)
f[it.ind] = 1;
else
s[it.ind] = 1;
ans++;
}
else
{
if(it.tip == 1)
{
bool ok = true;
for(auto in : inEdges[it.ind])
if(visEdge[in] == 1)
{
ok = false;
break;
}
if(ok == true)
{
ans++;
for(auto in : inEdges[it.ind])
visEdge[in] = true;
f[it.ind] = 1;
}
}
else
{
bool ok = true;
for(auto out : outEdges[it.ind])
if(visEdge[out] == 1)
{
ok = false;
break;
}
if(ok == true)
{
ans++;
for(auto out : outEdges[it.ind])
visEdge[out] = true;
s[it.ind] = 1;
}
}
}
fout << ans << '\n';
for(int i = 1; i <= N; i++)
{
if(f[i] == 0 && s[i] == 0)
fout << 0 << '\n';
else if(f[i] == 1 && s[i] == 0)
fout << 2 << '\n';
else if(f[i] == 0 && s[i] == 1)
fout << 1 << '\n';
else
fout << 3 << '\n';
}
return 0;
}