Pagini recente » Cod sursa (job #1189074) | Istoria paginii runda/onis-2016-runda-finala/clasament | Cod sursa (job #2998981) | Cod sursa (job #1030325) | Cod sursa (job #2458769)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("felinare.in");
ofstream fout("felinare.out");
int n, m, l[100005], r[100005], ans;
bool check[100005], sr[100005], sl[100005];
vector <int> v[100005];
void support(int nod)
{
for(int i = 0; i < v[nod].size(); i++)
{
int child = v[nod][i];
if(!sr[child])
{
sr[child] = 1;
sl[r[child]] = 0;
support(r[child]);
}
}
}
bool cuplaj(int nod)
{
if(check[nod]) return false;
check[nod] = true;
for(int i = 0; i < v[nod].size(); i++)
{
int child = v[nod][i];
if(!r[child])
{
r[child] = nod;
l[nod] = child;
return true;
}
}
for(int i = 0; i < v[nod].size(); i++)
{
int child = v[nod][i];
if(cuplaj(r[child]))
{
r[child] = nod;
l[nod] = child;
return true;
}
}
return false;
}
int main()
{
fin >> n >> m;
for(int i = 1; i <= m; i++)
{
int a, b;
fin >> a >> b;
v[a].push_back(b);
}
bool ok = true;
while(ok)
{
ok = 0;
memset(check, 0, sizeof(check));
for(int i = 1; i <= n; i++)
if(!l[i])
ok |= cuplaj(i);
}
for(int i = 1; i <= n; i ++)
if(l[i])
ans++;
fout << 2*n-ans << '\n';
for(int i = 1; i <= n; i++)
{
if(l[i])
sl[i] = 1;
}
for(int i = 1; i <= n; i++)
if(!l[i])
support(i);
for(int i = 1; i <= n; i ++)
{
if(sl[i] && sr[i])
fout << 0 << '\n';
else
if(sl[i]) fout << 2 << '\n';
else
if(sr[i]) fout << 1 << '\n';
else
fout << 3 << '\n';
}
return 0;
}