Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <cmath>
- #include <cstdio>
- #include <cstdlib>
- #include <climits>
- using namespace std;
- int n, m, u;
- int parent[2000];
- vector<int> mt(2000);
- vector<pair<int, int>> edges;
- vector<vector<int>> g;
- bool kuhn(int v) {
- if (parent[v] == u)
- return false;
- parent[v] = u;
- for (int i = 0; i < g[v].size(); ++i) {
- int to = g[v][i];
- if (mt[to] == -1 || kuhn(mt[to])) {
- mt[to] = v;
- return true;
- }
- }
- return false;
- }
- void solve() {
- int result = INT_MAX;
- for (int i = 0; i < n; ++i) {
- int with_i = 0, without_i = 0;
- int ans = 0;
- for (int j = 0; j < n; ++j)
- g[j].clear();
- mt.clear();
- mt.resize(2000, -1);
- for (int j = 0; j < m; ++j) {
- if ((edges[j].first == i) || (edges[j].second == i))
- ++with_i;
- else {
- g[edges[j].first].push_back(edges[j].second);
- ++without_i;
- }
- }
- for (int j = 0; j < n; ++j)
- u++, kuhn(j);
- int in_match = 0;
- for (int j = 0; j < n; ++j)
- if (mt[j] != -1)
- in_match++;
- ans += 2 * (n - 1) + 1 - with_i + without_i - in_match + (n - 1) - in_match;
- result = min(result, ans);
- }
- cout << result << endl;
- }
- int main() {
- scanf("%d%d", &n, &m);
- g.resize(2000, vector<int>());
- for (int i = 0; i < m; ++i) {
- int u, v;
- scanf("%d%d", &u, &v);
- u--, v--;
- edges.push_back(make_pair(u, v));
- }
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement