Pagini recente » Istoria paginii runda/vrfeijce | Cod sursa (job #1227645) | trainingts_bf | Istoria paginii runda/onemore | Cod sursa (job #305094)
Cod sursa(job #305094)
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;
#define MAX_N 9000
#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)
int N, M;
int C[MAX_N], R[MAX_N], S[MAX_N], D[MAX_N];
vector <int> G[MAX_N];
bitset <MAX_N> viz;
void citire()
{
scanf("%d %d",&N, &M);
while(M--)
{
int a, b;
scanf("%d %d",&a, &b);
G[a].push_back(b);
}
}
int pairup(int nod)
{
if(viz[nod]) return 0;
viz[nod] = 1;
foreach(G[nod])
if(!R[*it])
{
C[nod] = *it;
R[*it] = nod;
S[nod] = 1;
return 1;
}
foreach(G[nod])
if(pairup(R[*it]))
{
C[nod] = *it;
R[*it] = nod;
S[nod] = 1;
return 1;
}
return 0;
}
void cuplaj()
{
int ok = 1;
while(ok)
{
ok = 0;
viz.reset();
for(int i = 1; i <= N; ++i)
ok |= pairup(i);
}
int cnt = 0;
for(int i = 1; i <= N; ++i)
cnt += S[i];
printf("%d\n",2*N - cnt);
}
void suport(int nod)
{
foreach(G[nod])
{
if(!D[*it])
{
D[*it] = 1;
S[R[*it]] = 0;
suport(R[*it]);
}
}
}
void suport_min()
{
for(int i = 1; i <= N; ++i)
if(!S[i]) suport(i);
for(int i = 1; i <= N; ++i)
printf("%d\n",(1 - S[i]) + 2 * (1 - D[i]));
}
int main()
{
freopen("felinare.in","rt",stdin);
freopen("felinare.out","wt",stdout);
citire();
cuplaj();
suport_min();
}