Pagini recente » Profil barosan4422 | Cod sursa (job #658120) | Cod sursa (job #2590693) | Cod sursa (job #468946) | Cod sursa (job #567386)
Cod sursa(job #567386)
#include <cstdio>
#include <vector>
using namespace std;
const int N = 8200;
int n, m, pairs, rez[N], l_pair[N], r_pair[N];
bool f[N], l_marc[N], r_marc[N];
vector <int> L[N];
void read() {
int x, y;
freopen("felinare.in", "r", stdin);
freopen("felinare.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; ++ i) {
scanf("%d %d", &x, &y);
L[x].push_back(y);
}
}
bool cupleaza(int nod) {
if (f[nod])
return 0;
f[nod] = 1;
for (vector <int> :: iterator it = L[nod].begin(); it != L[nod].end(); ++ it)
if (! r_pair[*it]) {
l_pair[nod] = *it;
r_pair[*it] = nod;
return 1;
}
for (vector <int> :: iterator it = L[nod].begin(); it != L[nod].end(); ++ it)
if (r_pair[*it] && cupleaza(r_pair[*it])) {
l_pair[nod] = *it;
r_pair[*it] = nod;
return 1;
}
return 0;
}
void reset(bool f[N]) {
for (int i = 1; i < N; ++ i)
f[i] = false;
}
void cuplaj() {
bool ok = true;
while (ok) {
ok = false;
reset(f);
for (int i = 1; i <= n; ++ i)
if ((! l_pair[i]) && cupleaza(i)) {
ok = true;
++ pairs;
}
}
}
void init() {
for (int i = 1; i <= n; ++ i)
if ( l_pair[i])
l_marc[i] = true;
}
void change_vertex(int nod) {
for (vector <int> :: iterator it = L[nod].begin(); it != L[nod].end(); ++ it)
if (! r_marc[*it]) {
r_marc[*it] = true;
l_marc[r_pair[*it]] = false;
change_vertex(r_pair[*it]);
}
}
void vertex_cover() {
init();
for (int i = 1; i <= n; ++ i)
if(! l_marc[i])
change_vertex(i);
}
void solve() {
for (int i = 1; i <= n; ++ i) {
if (! l_marc[i])
++ rez[i];
if (! r_marc[i])
rez[i] += 2;
}
}
void afis() {
for (int i = 1; i <= n; ++ i)
printf("%d\n", rez[i]);
}
int main() {
read();
cuplaj();
printf("%d\n", 2 * n - pairs);
vertex_cover();
solve();
afis();
return 0;
}