费用流求调
  • 板块UVA1411 Ants
  • 楼主PassName
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/30 09:46
  • 上次更新2024/3/30 09:54:21
查看原帖
费用流求调
524911
PassName楼主2024/3/30 09:46

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;
}
2024/3/30 09:46
加载中...