summaryrefslogtreecommitdiff
path: root/graph/matching.cpp
diff options
context:
space:
mode:
authormzuenni <michi.zuendorf@gmail.com>2023-03-28 13:25:59 +0200
committermzuenni <michi.zuendorf@gmail.com>2023-03-28 13:25:59 +0200
commitfe5fa1141efeb7454c763dbd2645fb4ff04487a3 (patch)
treef2197bb94ce80ab2fae886177dfa9b0bd11538ac /graph/matching.cpp
parent3b91d2662310aee532cc84e1447824459671767e (diff)
merged
Diffstat (limited to 'graph/matching.cpp')
-rw-r--r--graph/matching.cpp32
1 files changed, 7 insertions, 25 deletions
diff --git a/graph/matching.cpp b/graph/matching.cpp
index ddd1c81..2deb672 100644
--- a/graph/matching.cpp
+++ b/graph/matching.cpp
@@ -1,32 +1,9 @@
constexpr int MOD=1'000'000'007, I=10;
vector<vector<ll>> adjlist, mat;
-int gauss(int n, ll p) {
- int rank = n;
- for (int line = 0; line < n; line++) {
- int swappee = line;
- while (swappee < n && mat[swappee][line] == 0) swappee++;
- if (swappee == n) {rank--; continue;}
- swap(mat[line], mat[swappee]);
- ll factor = powMod(mat[line][line], p - 2, p);
- for (int i = 0; i < n; i++) {
- mat[line][i] *= factor;
- mat[line][i] %= p;
- }
- for (int i = 0; i < n; i++) {
- if (i == line) continue;
- ll diff = mat[i][line];
- for (int j = 0; j < n; j++) {
- mat[i][j] -= (diff * mat[line][j]) % p;
- mat[i][j] %= p;
- if (mat[i][j] < 0) mat[i][j] += p;
- }}}
- return rank;
-}
-
int max_matching() {
int ans = 0;
- mat.assign(sz(adjlist), vector<ll>(sz(adjlist)));
+ mat.assign(sz(adjlist), {});
for (int _ = 0; _ < I; _++) {
for (int i = 0; i < sz(adjlist); i++) {
mat[i].assign(sz(adjlist), 0);
@@ -35,7 +12,12 @@ int max_matching() {
mat[i][j] = rand() % (MOD - 1) + 1;
mat[j][i] = MOD - mat[i][j];
}}}
- ans = max(ans, gauss(sz(adjlist), MOD)/2);
+ gauss(sz(adjlist), MOD); //LGS unten
+ int rank = 0;
+ for (auto& row : mat) {
+ if (*min_element(all(row)) != 0) rank++;
+ }
+ ans = max(ans, rank / 2);
}
return ans;
}