Pagini recente » Cod sursa (job #1001002) | Cod sursa (job #3228700) | Cod sursa (job #2372970) | Cod sursa (job #2907596) | Cod sursa (job #3196047)
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#define NMAX 8193
using namespace std;
ifstream fin ("felinare.in");
ofstream fout ("felinare.out");
int n, m, muchie[NMAX][NMAX], l[NMAX], r[NMAX];
vector<int> G[NMAX], GT[NMAX];
bitset<NMAX> viz;
void citire()
{
fin >> n >> m;
for (int i = 1; i <= m; i++)
{
int x, y;
fin >> x >> y;
G[x].push_back(y);
GT[y].push_back(x);
}
}
int match(int nod)
{
if (viz[nod] == true)
return false;
viz[nod] = true;
for (auto it:G[nod])
{
if (muchie[nod][it] == 0)
{
l[nod] = 0;
r[it] = 1;
muchie[nod][it] = 1;
return true;
}
if (muchie[nod][it] == 1)
{
if (l[nod] == 0 && match(it))
{
l[nod] = 1;
r[it] = 0;
muchie[nod][it] = 1;
return true;
}
}
}
return false;
}
int main()
{
citire();
bool ok = true;
while (ok)
{
ok = false;
viz.reset();
for (int i = 1; i <= n; i++)
if (!viz[i])
ok |= match(i);
}
for (int i = 1; i <= n; i++)
{
if (G[i].size() == 0) l[i] = 1;
if (GT[i].size() == 0) r[i] = 1;
}
int sol = 0;
for (int i = 1; i <= n; i++)
{
// cout << l[i] << " " << r[i] << "\n";
sol += (l[i] + r[i]);
}
fout << sol << "\n";
for (int i = 1; i <= n; i++)
{
if (l[i] == 0 && r[i] == 0) fout << "0\n";
if (l[i] == 1 && r[i] == 0) fout << "1\n";
if (l[i] == 0 && r[i] == 1) fout << "2\n";
if (l[i] == 1 && r[i] == 1) fout << "3\n";
}
return 0;
}