Pagini recente » Cod sursa (job #2585339) | Cod sursa (job #2675689) | Cod sursa (job #1866014) | Cod sursa (job #34675) | Cod sursa (job #1130422)
#include <fstream>
#include <vector>
#define NM 10010
using namespace std;
ifstream f("felinare.in");
ofstream g("felinare.out");
int N, M;
vector<int> G[NM];
int L[NM], R[NM];
int VCL[NM], VCR[NM];
int Viz[NM];
int run;
bool Pair (int node)
{
if (Viz[node]==run)
return 0;
Viz[node]=run;
for (vector<int>::iterator it=G[node].begin(); it!=G[node].end(); ++it)
if (R[*it]==0)
{
L[node]=*it;
R[*it]=node;
return 1;
}
for (vector<int>::iterator it=G[node].begin(); it!=G[node].end(); ++it)
if (Pair(R[*it]))
{
L[node]=*it;
R[*it]=node;
return 1;
}
return 0;
}
void Cover (int node)
{
for (vector<int>::iterator it=G[node].begin(); it!=G[node].end(); ++it)
if (VCR[*it]==0)
{
VCR[*it]=1;
VCL[R[*it]]=0;
Cover(R[*it]);
}
}
int main ()
{
f >> N >> M;
for (int i=1; i<=M; i++)
{
int a, b;
f >> a >> b;
G[a].push_back(b);
}
bool ok=1;
for (run=1; ok==1; run++)
{
ok=0;
for (int i=1; i<=N; i++)
if (!L[i])
ok|=Pair(i);
}
for (int i=1; i<=N; i++)
if (L[i]!=0)
VCL[i]=1;
for (int i=1; i<=N; i++)
if (VCL[i]==0)
Cover(i);
int ANS=0;
for (int i=1; i<=N; i++)
ANS+=2 - VCL[i] - VCR[i];
g << ANS << '\n';
for (int i=1; i<=N; i++)
{
int val=0;
if (VCL[i]==0)
val+=1;
if (VCR[i]==0)
val+=2;
g << val << '\n';
}
f.close();
g.close();
return 0;
}