Pagini recente » Cod sursa (job #1089961) | Cod sursa (job #2468799) | Cod sursa (job #2818333) | Cod sursa (job #700318) | Cod sursa (job #2851678)
#include <bits/stdc++.h>
using namespace std;
class Matcher {
int n, m;
vector <int> l, r;
vector <bool> upd;
vector <vector <int>> g;
vector <bool> isOn1, isOn2;
inline bool pairup(int u) {
if(upd[u]) return false;
upd[u] = true;
for(int v : g[u]) if(!l[v])
return (l[r[u] = v] = u);
for(int v : g[u]) if(pairup(l[v]))
return (l[r[u] = v] = u);
return false;
}
void fill01(int u) {
for(int v : g[u]) if(isOn2[v]) {
isOn2[v] = true;
isOn1[l[v]] = false;
fill01(l[v]);
}
}
inline bool is_matched(int u) { return r[u]; }
public:
Matcher(int n, int m) : n(n), m(m), l(m + 1, 0), r(n + 1, 0), upd(n + 1), g(n + 1), isOn1(n + 1, true), isOn2(m + 1, true) {}
void add_edge(int u, int v) { g[u].push_back(v); }
int match() {
for(bool ok = true; ok; ) {
ok = false;
fill(upd.begin(), upd.end(), false);
for(int i = 1; i <= n; i++) if(!r[i])
ok |= pairup(i);
}
int ans = 0;
for(int i = 1; i <= n; i++)
if(is_matched(i))
ans++,
isOn1[i] = false;
return ans;
}
void flood() {
for(int i = 1; i <= n; i++) if(!is_matched(i))
fill01(i);
}
void get_light_map(int& ans, vector <int>& sol) {
ans = 0;
for(int i = 1; i <= n; i++) {
int val = isOn1[i] | (isOn2[i] << 1);
sol.push_back(val);
ans += isOn1[i] + isOn2[i];
}
}
};
int main()
{
ifstream cin("felinare.in");
ofstream cout("felinare.out");
int n, m, u, v;
cin >> n >> m;
Matcher M(n, m);
for(int i = 1; i <= m; i++)
cin >> u >> v,
M.add_edge(u, v);
cout << 2 * n - M.match();
/*M.flood();
int ans = 0; vector <int> sol;
M.get_light_map(ans, sol);
cout << ans << "\n";
for(int x : sol)
cout << x << "\n";*/
return 0;
}