Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- using namespace std;
- const int N = 150007;
- const int INF = 1e7;
- int m, n, p;
- vector<int> g[2 * N];
- int match[N], dist[N];
- bool bfs() {
- queue<int> q;
- for(int i = 1; i <= n; i++) {
- if(match[i] == 0) {
- dist[i] = 0;
- q.push(i);
- }
- else dist[i] = INF;
- }
- dist[0] = INF;
- while(!q.empty()) {
- int u = q.front();
- q.pop();
- if(u == 0) continue;
- for(int v : g[u]) {
- if(dist[match[v]] == INF) {
- dist[match[v]] = dist[u] + 1;
- q.push(match[v]);
- }
- }
- }
- return dist[0] < INF;
- }
- bool dfs(int u) {
- if(u == 0) return true;
- for(int v : g[u]) {
- if(dist[match[v]] == dist[u] + 1) {
- if(dfs(match[v])) {
- match[v] = u;
- match[u] = v;
- return true;
- }
- }
- }
- dist[u] = INF;
- return false;
- }
- int matching() {
- int ans = 0;
- while(bfs())
- for(int i = 1; i <= n; i++)
- if(match[i] == 0)
- ans += dfs(i);
- return ans;
- }
- int32_t main() {
- freopen("in.txt", "r", stdin);
- //freopen("FMATCH.inp", "r", stdin);
- //freopen("FMATCH.out", "w", stdout);
- ios_base::sync_with_stdio(false);
- cin.tie(NULL); cout.tie(NULL);
- cin >> n >> m >> p;
- for(int i = 1; i <= p; ++i) {
- int u, v; cin >> u >> v;
- g[u].push_back(v + n);
- g[v + n].push_back(u);
- }
- cout << matching() << '\n';
- return 0;
- }
- /*
- #include <bits/stdc++.h>
- #define int long long
- using namespace std;
- const int N = 50005;
- const int INF = 1e7;
- int m, n, p;
- vector<int> g[N];
- int matx[N], maty[N];
- int dist[N];
- bool BFS() {
- queue<int> q;
- while(!q.empty())
- q.pop();
- for(int i = 1; i <= m; ++i) {
- if(!matx[i]) {
- dist[i] = 0;
- q.push(i);
- }
- else dist[i] = INF;
- }
- dist[0] = INF;
- while(!q.empty()) {
- int u = q.front();
- q.pop();
- if(dist[u] < dist[0])
- for(int v : g[u]) {
- if(dist[maty[v]] >= INF) {
- dist[maty[v]] = dist[u] + 1;
- q.push(maty[v]);
- }
- }
- }
- return dist[0] < INF;
- }
- bool DFS(const int &u) {
- if(u == 0) return true;
- for(int v : g[u]) {
- if(dist[maty[v]] == dist[u] + 1)
- if(DFS(maty[v])) {
- matx[u] = v;
- maty[v] = u;
- return true;
- }
- }
- dist[u] = INF;
- return false;
- }
- void fastmatching() {
- fill(matx + 1, matx + m + 1, 0);
- fill(maty + 1, maty + n + 1, 0);
- int res = 0;
- while(BFS()) {
- for(int i = 1; i <= m; ++i)
- if(!matx[i])
- res += DFS(i);
- }
- cout << res << '\n';
- }
- int32_t main() {
- //freopen("in.txt", "r", stdin);
- //freopen("FMATCH.inp", "r", stdin);
- //freopen("FMATCH.out", "w", stdout);
- ios_base::sync_with_stdio(false);
- cin.tie(NULL); cout.tie(NULL);
- cin >> m >> n >> p;
- for(int i = 1; i <= p; ++i) {
- int u, v; cin >> u >> v;
- g[u].push_back(v);
- }
- fastmatching();
- return 0;
- }
- */
Add Comment
Please, Sign In to add comment