Pagini recente » Cod sursa (job #1374851) | Istoria paginii runda/simulare_oji_9/clasament | Cod sursa (job #2306550) | Cod sursa (job #2220947) | Cod sursa (job #1806171)
#include <fstream>
#include <vector>
#define DIM 9000
using namespace std;
ifstream f("felinare.in");
ofstream g("felinare.out");
vector <int> ls[DIM];
bool stinsL[DIM], stinsR[DIM], viz[DIM];
int n, k, i, j, x, y, cnt;
int Left[DIM], Right[DIM];
bool pairup(int x) {
if (viz[x] == k)
return 0;
viz[x] = k;
int i, y;
for (i = 0; i < ls[x].size(); i++) {
y = ls[x][i];
if (Left[y] == 0 || pairup(Left[x]) == 1) {
Left[y] = x;
Right[x] = y;
return 1;
}
}
return 0;
}
void aprinde(int x) {
int i, y;
for (i = 0; i < ls[x].size(); i++) {
y = ls[x][i];
if (stinsR[y] == 0) {
stinsR[y] = 1;
stinsL[Left[y]] = 0;
aprinde(Left[y]);
}
}
}
int main() {
int m;
f >> n >> m;
for (i = 1; i <= m; i++) {
f >> x >> y;
ls[x].push_back(y);
}
for (i = 1; i <= n; i++)
if (!viz[i]) {
k = i;
cnt += pairup(i);
}
g << 2*n-cnt << '\n';
for (i = 1; i <= n; i++)
if (Right[i] != 0)
stinsL[i] = 1;
for (i = 1; i <= n; i++)
if (Right[i] == 0)
aprinde(i);
for (i = 1; i <= n; i++) {
x = 0;
if (stinsL[i] == 0)
x++;
if (stinsR[i] == 0)
x += 2;
g << x << '\n';
}
return 0;
}