HDU 3920 Clear All of Them I(状态压缩)

https://blog.csdn.net/lxglbk/article/details/6674270

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;
#define MAXN 1111111
#define INF 0x3fffffff

struct Point {
    double x, y;
} node[22];

int n;

double status[MAXN];
double dist(Point a, Point b) {
    return sqrt((a.x-b.x)*(a.x-b.x)
                +(a.y-b.y)*(a.y-b.y));
}

bool nodecmp(const Point a, const Point b) {
    return dist(node[0], a) < dist(node[0], b);
}

double min(double x, double y) {
    return x < y ? x : y;
}

double dfs(int sta, int cnum) {
    if(status[sta] != -1)
        return status[sta];

    if(cnum == n)//干掉了n对人
        return 0;

    int pos = -1;
    int temp = sta;
    status[sta] = INF;
    for(int c = 1; temp; temp >>= 1, c++) {
        if(temp & 1) {
            if(pos == -1)//确定第一点
                pos = c;
            else//到了第二点
                status[sta] = min(status[sta], dfs(sta-(1<<(pos-1))-(1<<(c-1)), cnum+1)
                               + dist(node[0], node[pos]) + dist(node[pos], node[c]));
        }
    }

    return status[sta];
}

int main() {
    freopen("data.in", "r", stdin);
    int t, casenum;
    int i, upper;

    scanf("%d", &t);
    for(casenum = 1; casenum <= t; casenum++) {
        scanf("%lf %lf", &node[0].x, &node[0].y);
        scanf("%d", &n);

        upper = n<<1;

        for(i = 1; i <= upper; i++) {
            scanf("%lf %lf", &node[i].x, &node[i].y);
        }

        sort(node+1, node+1+upper, nodecmp);
        memset(status, -1, sizeof(status));

        double ans = dfs((1<<upper)-1, 0);//倒推 关键 避免超时
        printf("Case #%d: %.2lf\n",casenum, ans);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/ccshijtgc/article/details/83036635
今日推荐