Pagini recente » Cod sursa (job #2908406) | Cod sursa (job #3272047) | Cod sursa (job #1689508) | Cod sursa (job #581163) | Cod sursa (job #302172)
Cod sursa(job #302172)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
#define pb push_back
#define tr(C, i) for (typeof((C).begin()) i = (C).begin(); i != (C).end(); ++i)
typedef vector<int> VI;
typedef vector<VI> VVI;
int N;
VVI G;
VI U, L, R;
bool pairup(int u) {
if (U[u])
return false;
U[u] = true;
tr(G[u], vv)
if (!R[*vv]) {
L[u] = *vv;
R[*vv] = u;
return true;
}
tr(G[u], vv)
if (pairup(R[*vv])) {
L[u] = *vv;
R[*vv] = u;
return true;
}
return false;
}
int main(int argc, char *argv[]) {
int M, u, v;
ifstream fin("felinare.in");
fin >> N >> M;
G.resize(N+1);
while (M--) {
fin >> u >> v;
G[u].pb(v);
}
fin.close();
U.resize(N+1);
L.resize(N+1);
R.resize(N+1);
for (bool changed = true; changed; ) {
fill(U.begin(), U.end(), false);
changed = false;
for (int i = 1; i <= N; ++i)
if (!L[i])
changed |= pairup(i);
}
int cuplaj = 0;
for (int i = 1; i <= N; ++i)
if (L[i])
++cuplaj;
ofstream fout("felinare.out");
fout << 2*N - cuplaj << endl;
fout.close();
return 0;
}