mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
57 lines
1.4 KiB
C++
57 lines
1.4 KiB
C++
|
const int MAXN = 210;
|
|||
|
int nx, ny; // 左边的点标号从1到nx,右边点标号从1到ny
|
|||
|
long long inf, cost[MAXN][MAXN], fx[MAXN], fy[MAXN], dist[MAXN]; //权值若为long long的话,只需改动此行即可
|
|||
|
int used[MAXN], maty[MAXN], which[MAXN];
|
|||
|
inline void AddEdge(int x, int y, int z) {
|
|||
|
cost[x][y] = z;
|
|||
|
}
|
|||
|
pair<int, long long> KM(void) {
|
|||
|
for (int x = 1; x <= nx; x++) {
|
|||
|
int y0 = 0; maty[0] = x;
|
|||
|
for (int y = 0; y <= ny; y++) { dist[y] = inf + 1; used[y] = false; }
|
|||
|
do {
|
|||
|
used[y0] = true;
|
|||
|
int x0 = maty[y0], y1;
|
|||
|
long long delta = inf + 1;
|
|||
|
for (int y = 1; y <= ny; y++) if (!used[y]) {
|
|||
|
long long curdist = cost[x0][y] - fx[x0] - fy[y];
|
|||
|
if (curdist < dist[y]) {
|
|||
|
dist[y] = curdist;
|
|||
|
which[y] = y0;
|
|||
|
}
|
|||
|
if (dist[y] < delta) {
|
|||
|
delta = dist[y];
|
|||
|
y1 = y;
|
|||
|
}
|
|||
|
}
|
|||
|
for (int y = 0; y <= ny; y++) if (used[y]) {
|
|||
|
fx[maty[y]] += delta;
|
|||
|
fy[y] -= delta;
|
|||
|
} else dist[y] -= delta;
|
|||
|
y0 = y1;
|
|||
|
} while (maty[y0] != 0);
|
|||
|
do {
|
|||
|
int y1 = which[y0];
|
|||
|
maty[y0] = maty[y1];
|
|||
|
y0 = y1;
|
|||
|
} while (y0);
|
|||
|
}
|
|||
|
long long ret = 0;
|
|||
|
int npair = 0;
|
|||
|
for (int y = 1; y <= ny; y++) {
|
|||
|
int x = maty[y];
|
|||
|
if (cost[x][y] < inf) {
|
|||
|
ret += cost[x][y];
|
|||
|
npair++;
|
|||
|
}
|
|||
|
}
|
|||
|
return make_pair(npair, ret);
|
|||
|
}
|
|||
|
inline void clear(void) {
|
|||
|
memset(fx, 0x9f, sizeof fx);
|
|||
|
memset(fy, 0x9f, sizeof fy);
|
|||
|
memset(cost, 0x3f, sizeof cost);
|
|||
|
memset(maty, 0, sizeof maty);
|
|||
|
inf = cost[0][0];
|
|||
|
}
|