Pagini recente » Cod sursa (job #102862) | Cod sursa (job #631889) | Cod sursa (job #1208491) | Cod sursa (job #2361124) | Cod sursa (job #2415229)
#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;
}
void dfs2(int nod)
{
if(viz[nod])
return;
viz[nod] = 1;
for(int i = 0; i < v[nod].size(); ++i)
{
int vecin = v[nod][i];
if(stanga[vecin] != nod && !scosb[vecin])
{
scosb[vecin] = 1;
dfs2(dreapta[vecin]);
}
}
}
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;
memset(viz, 0, sizeof(viz));
for(int i = 1; i <= n; ++i)
if(stanga[i])
--ans;
else
dfs2(i);
g << ans << '\n';
for(int i = 1; i <= n; ++i)
g << viz[i] + 2 * (1 - scosb[i]) << '\n';
return 0;
}