Pagini recente » Cod sursa (job #1628487) | Cod sursa (job #2227282) | Cod sursa (job #621852) | Cod sursa (job #758422) | Cod sursa (job #2214992)
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
#define NMAX 8193
#define MMAX 20001
int n, m;
vector<int> G[NMAX];
bitset<NMAX> visited, supl, supr;
int nodl[NMAX], nodr[NMAX];
bool coupling(int nod)
{
if (visited[nod])
return false;
visited[nod] = 1;
for (auto v : G[nod])
{
if (nodr[v] == 0)
{
nodr[v] = nod;
nodl[nod] = v;
return true;
}
}
for (auto v : G[nod])
{
if (coupling(nodr[v]))
{
nodr[v] = nod;
nodl[nod] = v;
return true;
}
}
return false;
}
void support(int nod)
{
for (auto v : G[nod])
if (!supr[v])
{
supr[v] = 1;
supl[nodr[v]] = 0;
support(nodr[v]);
}
}
int main()
{
ifstream fin("felinare.in");
fin >> n >> m;
int x, y;
for (int i = 0; i < m; i++)
{
fin >> x >> y;
G[x].push_back(y);
}
fin.close();
bool ok;
do
{
ok = false;
for (int i = 1; i <= n; i++)
if (!visited[i])
ok |= coupling(i);
}
while (ok);
for (int i = 1; i <= n; i++)
if (visited[i])
supl[i] = true;
int sol = (n << 1);
for (int i = 1; i <= n; i++)
{
if (supl[i])
--sol;
if (supr[i])
--sol;
}
ofstream fout("felinare.out");
fout << sol << '\n';
for (int i = 0; i <= n; i++)
fout << supl[i] + (2 * supr[i]) << '\n';
fout.close();
return 0;
}