Pagini recente » Cod sursa (job #2514565) | Cod sursa (job #2785326) | Cod sursa (job #1113504) | Cod sursa (job #226941) | Cod sursa (job #2067204)
#include<fstream>
#include<vector>
using namespace std;
ifstream in ("felinare.in");
ofstream out ("felinare.out");
const int dim = 8200;
int dreapta[dim],stanga[dim],rez,sr[dim],sl[dim],n,m,a,b,sol;
bool marked[dim],ok;
vector<int>v[dim];
bool cuplaj (int knot) {
int vecin;
if (marked[knot]) {
return 0;
}
marked[knot] = 1;
for (int i = 0; i < v[knot].size(); i ++) {
vecin = v[knot][i];
if (dreapta[vecin] == 0) {
dreapta[vecin] = knot;
stanga[knot] = vecin;
return 1;
}
}
for (int i = 0; i < v[knot].size(); i ++) {
vecin = v[knot][i];
if (cuplaj(dreapta[vecin]) == 1) {
dreapta[vecin] = knot;
stanga[knot] = vecin;
return 1;
}
}
return 0;
}
void suport (int knot) {
int vecin;
for (int i = 0; i < v[knot].size(); i ++) {
vecin = v[knot][i];
if (sr[vecin] == 0) {
sr[vecin] = 1;
sl[dreapta[vecin]] = 0;
suport (dreapta[vecin]);
}
}
return;
}
int main (void) {
in >> n >> m;
for (int i = 1; i <= m; i ++) {
in >> a >> b;
v[a].push_back (b);
}
ok = 1;
while (ok) {
for (int i = 1; i <= n; i ++) {
marked[i] = 0;
}
ok = 0;
for (int i = 1; i <= n; i ++) {
if (stanga[i] == 0 && cuplaj(i) == 1) {
ok = 1;
}
}
}
for (int i = 1; i <= n; i ++) {
if (stanga[i] != 0) {
sl[i] = 1;
}
}
for (int i = 1; i <= n; i ++) {
if (sl[i] == 0) {
suport (i);
}
}
for (int i = 1; i <= n; i ++) {
if (sl[i] == 0) {
sol++;
}
if (sr[i] == 0) {
sol++;
}
}
out << sol <<"\n";
for (int i = 1; i <= n; i ++) {
rez = 3;
if (sl[i] == 1) {
rez --;
}
if (sr[i] == 1) {
rez -= 2;
}
out << rez <<"\n";
}
return 0;
}