Pagini recente » Cod sursa (job #2218631) | Cod sursa (job #2396490) | Cod sursa (job #2902980) | Cod sursa (job #2703471) | Cod sursa (job #2030795)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 8191;
vector <int> g[MAXN + 1];
int l[MAXN + 1], r[MAXN + 1], seen[MAXN + 1], lside[MAXN + 1], rside[MAXN + 1];
int match(int node) {
if (seen[node])
return 0;
seen[node] = 1;
for (auto it : g[node])
if (r[it] == 0) {
l[node] = it;
r[it] = node;
return 1;
}
for (auto it : g[node])
if (match(r[it])) {
l[node] = it;
r[it] = node;
return 1;
}
return 0;
}
int max_match(int n) {
int augm;
do {
augm = 0;
memset(seen, 0, sizeof seen);
for (int i = 1; i <= n; ++i)
if (l[i] == 0)
augm += match(i);
} while (augm);
for (int i = 1; i <= n; ++i)
if (l[i]) {
++augm;
lside[i] = 1;
}
return augm;
}
void swap_sides(int node) {
for (auto it : g[node])
if (rside[it] == 0) {
rside[it] = 1;
lside[r[it]] = 0;
swap_sides(r[it]);
}
}
int main()
{
int n, m;
ifstream fin("felinare.in");
fin >> n >> m;
for (int i = 0; i < m; ++i) {
int x, y;
fin >> x >> y;
g[x].push_back(y);
}
fin.close();
int mvc_size = max_match(n);
for (int i = 1; i <= n; ++i)
if (lside[i] == 0)
swap_sides(i);
ofstream fout("felinare.out");
fout << 2 * n - mvc_size << '\n';
for (int i = 1; i <= n; ++i)
fout << (!lside[i]) + ((!rside[i]) << 1) << '\n';
fout.close();
return 0;
}