RT,照的第一篇题解思路写的还是不对,,,一直输出 -5
#include <bits/stdc++.h>
#define rint register int
#define endl '\n'
using namespace std;
const int inf = 1e9;
const int N = 5e3 + 5;
const int M = 1e5 + 5;
int S, T, ax[N], ay[N], bx[N], by[N];
int head[N], ne[M], f[M], e[M], w[M], idx = 1;
int dist[N], h[N], pre[N], n, m;
bool v[N];
int flow = inf, ans, maxflow;
priority_queue<pair<int, int>> q;
void add(int a, int b, int c, int d)
{
e[++idx] = b, f[idx] = c, w[idx] = d, ne[idx] = head[a], head[a] = idx;
e[++idx] = a, f[idx] = 0, w[idx] = -d, ne[idx] = head[b], head[b] = idx;
}
bool dijkstra()
{
for (rint i = S; i <= T; i++)
{
dist[i] = inf;
}
memset(v, 0, sizeof v);
q.push(make_pair(0, S));
dist[S] = 0;
v[S] = 1;
while (!q.empty())
{
int x = q.top().second;
q.pop();
if (v[x])
{
continue;
}
v[x] = 1;
for (rint i = head[x]; i; i = ne[i])
{
if (f[i] <= 0)
{
continue;
}
int y = e[i];
int z = w[i];
if (dist[y] > dist[x] + z + h[x] - h[y])
{
dist[y] = dist[x] + z + h[x] - h[y];
pre[y] = i;
q.push(make_pair(-dist[y], y));
}
}
}
return dist[T] < inf;
}
void solve()
{
int x = T;
int k = flow;
while (x != S)
{
int i = pre[x];
k = min(k, f[i]);
x = e[i ^ 1];
}
x = T;
while (x != S)
{
int i = pre[x];
f[i] -= k;
f[i ^ 1] += k;
x = e[i ^ 1];
}
for (rint i = 1; i <= n; i++) h[i] += dist[i];
flow -= k;
maxflow += k;
ans += k * h[T];
}
double calc(int x, int y)
{
return sqrt((double)(ax[x] - bx[y]) * (ax[x] - bx[y]) + (double)(ay[x] - by[y]) * (ay[x] - by[y]));
}
signed main()
{
while (cin >> n)
{
idx = 1;
memset(h, 0, sizeof h);
S = 0;
T = n * 2 + 1;
for (rint i = 1; i <= n; i++) scanf("%d%d", &ax[i], &ay[i]);
for (rint i = 1; i <= n; i++) scanf("%d%d", &bx[i], &by[i]);
for (rint i = 1; i <= n; i++)
{
for (rint j = 1; j <= n; j++)
{
double d = calc(i, j);
add(i, j + n, 1, d);
add(j + n, i, 0, -d);
}
}
for (rint i = 1; i <= n; i++)
{
add(S, i, 1, 0);
add(i, S, 0, 0);
}
for (rint i = 1; i <= n; i++)
{
add(i + n, T, 1, 0);
add(T, i + n, 0, 0);
}
solve();
for (rint i = 1; i <= n; i++)
{
for (rint j = head[i]; j; j = ne[j])
{
int y = e[j];
if (!f[j])
{
printf("%d\n", y - n);
break;
}
}
}
}
return 0;
}