#include <iostream> #include <vector> using namespace std; int n, m; bool visit[10000]; int match[10000]; vector<int> graph[10000]; bool augment(int u) { int v; for(int i = 0; i < graph[u].size(); ++i) { v = graph[u][i]; if(!visit[v]) { visit[v] = true; if(match[v] == -1 || augment(match[v])) { match[v] = u; return true; } } } return false; } for(int i = 0; i < n; ++i) match[i] = -1; for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) visit[j] = false; augment(i); }
#include <iostream> #include <vector> #include <unordered_map> using namespace std; #define SIZE 2 * 100 + 4 #define INF 1e9 int n, m; bool visit[SIZE]; vector<int> graph[SIZE]; unordered_map<int, int> capacity, flow; bool augment(int u, int val) { visit[u] = true; if(u == 2 * n + 3) return val; int v, res, delta, cuv; for(int i = 0; i < graph[u].size(); ++i) { v = graph[u][i]; cuv = capacity[u * SIZE + v]; if(!visit[v] && cuv > flow[u * SIZE + v]) { res = min(val, cuv - flow[u * SIZE + v]); delta = augment(v, res); if(delta > 0) { flow[u * SIZE + v] += delta; flow[v * SIZE + u] -= delta; return delta; } } } return 0; } void add(int u, int v, int c) { graph[u].push_back(v); flow[u * SIZE + v] = 0; flow[v * SIZE + u] = 0; capacity[u * SIZE + v] = c; graph[v].push_back(u); capacity[v * SIZE + u] = 0; } do { for(int i = 0; i <= t2; ++i) visit[i] = false; } while(augment(s1, 1e9) > 0);