UVALive - 3972 March of the Penguins(最大流+枚舉)

來源:互聯網
上載者:User

標籤:

題目大意:有n個冰塊,每塊冰塊能承受mi只企鵝從上面跳走
初始時每個冰塊上有ai只企鵝,每隻企鵝跳躍的最遠距離為d,要求所有的企鵝在同一片冰塊上集合,問哪些冰塊滿足要求

解題思路:這題和HDU - 2732 Leapin’ Lizards
類似,具體的就不講了,枚舉+最大流就可以了

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <cmath>using namespace std;#define M 1000010#define N 10010#define INF 0x3f3f3f3fstruct Edge{    int u, v, cap, flow, next;}E[M];struct Dinic{    int head[N], d[N];    int tot, sink, source;    void init() {        memset(head, -1, sizeof(head));        tot = 0;    }    inline void AddEdge(int u, int v, int cap) {        E[tot].u = u; E[tot].v = v; E[tot].cap = cap; E[tot].flow = 0; E[tot].next = head[u]; head[u] = tot++;        u = u ^ v; v = u ^ v; u = u ^ v;        E[tot].u = u; E[tot].v = v; E[tot].cap = 0; E[tot].flow = 0; E[tot].next = head[u]; head[u] = tot++;    }    inline bool bfs(int s) {        int u, v;        memset(d, 0, sizeof(d));        queue<int> Q;        Q.push(s);        d[s] = 1;        while (!Q.empty()) {            u = Q.front(); Q.pop();            if (u == sink) return true;            for (int i = head[u]; ~i; i = E[i].next) {                v = E[i].v;                if (!d[v] && E[i].cap - E[i].flow > 0) {                    d[v] = d[u] + 1;                    Q.push(v);                }            }        }        return false;    }    int dfs(int x, int a) {        if (x == sink || a == 0)            return a;        int f, flow = 0;        for (int i = head[x]; ~i; i = E[i].next) {            int v = E[i].v;            if (d[v] == d[x] + 1 && E[i].cap - E[i].flow > 0) {                f = dfs(v, min(a, E[i].cap - E[i].flow));                E[i].flow += f;                E[i^1].flow -= f;                flow += f;                a -= f;                if (!a) break;            }        }        if (flow == 0) d[x] = 0;        return flow;    }    int Maxflow(int source, int sink) {        int flow = 0;        this->sink = sink;        while (bfs(source)) flow += dfs(source, INF);        return flow;    }};Dinic dinic;#define maxn 110#define esp 1e-5struct Ice{    int x, y, n, m;}ice[maxn];double dis[maxn][maxn];double Max;int n, Sum;double distance(int i, int j) {    int x = ice[i].x - ice[j].x;    int y = ice[i].y - ice[j].y;    return sqrt(1.0 * x * x + 1.0 * y * y);}void init() {    scanf("%d%lf", &n, &Max);    Sum = 0;    for (int i = 1; i <= n; i++) {        scanf("%d%d%d%d", &ice[i].x, &ice[i].y, &ice[i].n, &ice[i].m);        Sum += ice[i].n;    }    for (int i = 1; i <= n; i++)         for (int j = i + 1; j <= n; j++)            dis[i][j] = dis[j][i] = distance(i, j);}void solve() {    bool flag = false;    int source = 0, sink = N - 1;    for (int i = 1; i <= n; i++) {        dinic.init();        for (int j = 1; j <= n; j++) {            if (i == j)                 dinic.AddEdge(j * 2, sink, INF);            dinic.AddEdge(j * 2, (j * 2) + 1, ice[j].m);            dinic.AddEdge(source, j * 2, ice[j].n);            for (int k = j + 1; k <= n; k++)                 if (Max - dis[j][k] > esp) {                    dinic.AddEdge((j * 2) + 1, k * 2, INF);                    dinic.AddEdge((k * 2) + 1, j * 2, INF);                }        }        int maxflow = dinic.Maxflow(source, sink);        if ( maxflow == Sum) {            if (flag)                printf(" ");            flag = true;            printf("%d", i - 1);        }    }    if (!flag)        printf("-1");    printf("\n");}int main() {    int test;    scanf("%d", &test);    while (test--) {        init();        solve();    }    return 0;}

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

UVALive - 3972 March of the Penguins(最大流+枚舉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.