Pagini recente » Cod sursa (job #1962029) | Cod sursa (job #1743397) | Cod sursa (job #2470984) | Cod sursa (job #1057648) | Cod sursa (job #2415207)
#include<bits/stdc++.h>
using namespace std;
ifstream f("felinare.in");
ofstream g("felinare.out");
int n, m;
vector<int>v[8200];
int stanga[8200], dreapta[8200];
bool viz[8200];
bool scos[8200], scosb[8200];
int grs[8200], grd[8200];
bool dfs(int nod)
{
if(viz[nod])
return 0;
viz[nod] = 1;
for(int i = 0; i < v[nod].size(); i++)
{
int vecin = v[nod][i];
if(!dreapta[vecin])
{
stanga[nod] = vecin;
dreapta[vecin] = nod;
return 1;
}
}
for(int i = 0; i < v[nod].size(); i++)
{
int vecin = v[nod][i];
if(dfs(dreapta[vecin]))
{
stanga[nod] = vecin;
dreapta[vecin] = nod;
return 1;
}
}
return 0;
}
int main()
{
f >> n >> m;
for(int i = 1; i <= m; ++i)
{
int a, b;
f >> a >> b;
grs[a]++, grd[b]++;
v[a].push_back(b);
}
bool ok = 1;
while(ok)
{
ok = 0;
memset(viz, 0, sizeof(viz));
for(int i = 1; i <= n; ++i)
if(!stanga[i] && dfs(i))
ok = 1;
}
int ans = 2 * n;
for(int i = 1; i <= n; ++i)
if(stanga[i])
--ans;
g << ans << '\n';
for(int i = 1; i <= n; ++i)
if(stanga[i])
{
if(!scos[i] && !scosb[stanga[i]])
{
if(grs[i] >= grd[stanga[i]])
scos[i] = 1;
else
scosb[stanga[i]] = 1;
}
}
for(int i = 1; i <= n; ++i)
g << (1 - scos[i]) + 2 * (1 - scosb[i]) << '\n';
return 0;
}