码迷,mamicode.com
首页 > Web开发 > 详细

BZOJ 4080 Wf2014 Sensor Network 随机化

时间:2015-05-22 15:16:55      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:bzoj   bzoj4080   随机化   

题目大意:给定平面上的n个点,求一个最大的点集,使得两两之间距离不超过d

爆搜T到死,加什么剪枝都没用……

随机化大法好

每次随机一个序列,依次贪心加入,然后更新答案

据说很靠谱?反正写完直接过了

#include <bitset>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 110
using namespace std;
typedef bitset<M> abcd;
struct Point{
    int x,y;
    friend istream& operator >> (istream &_,Point &p)
    {
        return scanf("%d%d",&p.x,&p.y),_;
    }
    friend bool operator < (const Point &p1,const Point &p2)
    {
        return p1.x < p2.x ;
    }
    friend int Distance(const Point &p1,const Point &p2)
    {
        return (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) ;
    }
}points[M];
int n,d;
abcd a[M];
abcd now,able,ans;
int main()
{
    int i,j;
    cin>>n>>d;
    for(i=1;i<=n;i++)
        cin>>points[i];
    for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++)
            if(Distance(points[i],points[j])<=d*d)
                a[i][j]=a[j][i]=true;
    static int order[M];
    for(i=1;i<=n;i++)
    {
        able[i]=true;
        order[i]=i;
    }
    for(j=1;j<=1000;j++)
    {
        abcd able=::able;
        now.reset();
        for(i=1;i<=n;i++)
            if(able[order[i]])
            {
                now[order[i]]=true;
                able&=a[order[i]];
            }
        if(now.count()>ans.count())
            ans=now;
        random_shuffle(order+1,order+n+1);
    }
    cout<<ans.count()<<endl;
    for(i=1;i<=n;i++)
        if(ans[i])
            printf("%d ",i);
    return 0;
}

BZOJ 4080 Wf2014 Sensor Network 随机化

标签:bzoj   bzoj4080   随机化   

原文地址:http://blog.csdn.net/popoqqq/article/details/45916455

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