码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2 3498

时间:2020-12-17 12:05:40      阅读:3      评论:0      收藏:0      [点我收藏+]

标签:span   mes   fine   const   set   memset   --   include   main   

把冰块拆点来保证企鹅起跳的限制,对于所有点为汇点跑一边最大流看看是不是和企鹅人数相等

#include<bits/stdc++.h>
#define FT(a,b) memset(a,b,sizeof(a))
using namespace std;

const int N = 300 + 10 ,M = N * N + N * 2 << 1, INF = 0x3f3f3f3f;
const double esp = 1e-6;
int h[N],e[M],ne[M],w[M],idx;
int n,m,s,t;
int gap[N],cur[N],deepth[N];
double d;
struct node
{
    int x, y;
}p[N];
void add(int a,int b,int c)
{
    e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx ++ ;
    swap(a,b),c = 0;
    e[idx] = b,ne[idx] = h[a],w[idx] = c,h[a] = idx ++ ;
}
void bfs()
{
    queue<int>q;
    FT(deepth,-1),FT(gap,0);
    q.push(t);
    deepth[t] = 0,gap[0] = 1;
    while(q.size())
    {
        int a = q.front();
        q.pop();
        for(int i = h[a];~i; i = ne[i])
        {
            int j = e[i];
            if(deepth[j] == -1)
            {
                deepth[j] = deepth[a] + 1;
                q.push(j);
                gap[deepth[j]]++;
            }
        }
    }
}
int dfs(int now,int flow)
{
    if(now == t)
        return flow;
    int nowflow = 0;
    for(int i = h[now];~i;i = ne[i])
    {
        int j = e[i];
        if(w[i]&&deepth[j] + 1 == deepth[now])
        {
            int k = dfs(j,min(w[i],flow - nowflow));
            w[i]-=k,w[i^1]+=k,nowflow +=k;
            if(flow == nowflow)
                return flow;
        }
    }
    gap[deepth[now]]--;
    if(!gap[deepth[now]])
        gap[s] = n + 2;
    ++deepth[now];
    ++gap[deepth[now]];
    return nowflow;
}
int ISAP()
{
    int ans = 0;
    bfs();
    while(gap[s]<n)
    {
        memcpy(cur,h,sizeof(h));
        ans += dfs(s,INF);
    }
    // cout << ans << endl;
    return ans;
}
void solve()
{
    FT(h,-1),idx = 0;
    cin >> n >> d;
    s = 2 * n,t =2 *  n + 1;
    int tot = 0;
    for(int i = 0;i<n;i++)
    {
        int a,b;
        cin >> p[i].x >> p[i].y>> a >> b;
        add(s,i,a);
        add(i,i+n,b);
        tot += a;
    }
    for(int i = 0;i<n;i++)
    {
        for(int j = 0;j < n;j++)
        {
            int dis = ((p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y));
            if(dis <= d * d + esp)
            {
                add(i+n,j,INF);
                // cout << i << " " << j << endl;
            }
        }
    }
    int res = 0;
    for(int i = 0;i<n;i++)
    {
        t = i;
        for(int j = 0;j<idx;j+=2)
        {
            w[j]+=w[j^1];
            w[j^1] = 0;
        }
        if(ISAP() >= tot)
            cout << i << " ", res ++;
    }
    if(!res) 
        cout << -1;
        cout << endl;
}

int main()
{
    int t = 0;
    cin >> t;
    while(t--)
    {
        solve();
    }
    return 0;
}

 

POJ2 3498

标签:span   mes   fine   const   set   memset   --   include   main   

原文地址:https://www.cnblogs.com/ignorance/p/14122131.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!