题目描述

A wireless sensor network consists of autonomous sensors scattered in an environment where they monitor conditions such as temperature, sound, and pressure.

Samantha is a researcher working on the Amazon Carbon-dioxide Measurement (ACM) project. In this project, a wireless sensor network in the Amazon rainforest gathers environmental information. The Amazon rainforest stores an amount of carbon equivalent to a decade of global fossil fuel emissions, and it plays a crucial role in the world’s oxygen-transfer processes. Because of the huge size of this forest, changes in the forest affect not only the local environment but also global climate by altering wind and ocean current patterns. The goal of the ACM project is to help scientists better understand earth’s complex ecosystems and the impact of human activities.

Samantha has an important hypothesis and to test her hypothesis, she needs to find a subset of sensors in which each pair of sensors can communicate directly with each other. A sensor can communicate directly with any other sensor having distance at most \(d\) from it. In order for her experiments to be as accurate as possible, Samantha wants to choose as many sensors as possible.

As one does not simply walk into the Amazon, Samantha cannot add new sensors or move those that are currently in place. So given the current locations of the sensors, she needs your help to find the largest subset satisfying her criteria. For simplicity, represent the location of each sensor as a point in a two-dimensional plane with the distance between two points being the usual Euclidean distance.

输入格式

The input consists of a single test case. The first line contains two integers \(n\) and \(d\) (\(1 \le n \le 100\) and \(1 \le d \le 10\, 000\)), where \(n\) is the number of sensors available and \(d\) is the maximum distance between sensors that can communicate directly. Sensors are numbered \(1\) to \(n\). Each of the next \(n\) lines contains two integers \(x\) and \(y\) (\(-10\, 000\le x, y \le 10\, 000\)) indicating the sensor coordinates, starting with the first sensor.

求最大独立集,首先可以用爆搜/随机化(模拟退火)

然后来看正常解法。

直接做是很难做的,考虑枚举两个最远点。然后就有了这样一幅图。

只有不规则图形 ADB 和 ABC 中的点可能被选上。

然后 用初中数学 分析一下发现,如果将所有大于 \(d\) 的可选点连边,是一个二分图。因为只有在直线两边的点会连起来。

然后就是求二分图最大独立集的问题了。

理论复杂度 \(O(n^{4.5})\),理论上还可以除以 \(\omega\),但是本身常数就很小所以不用。

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,d,vs[N],v[N][N],c,st[N],p[N],l,r,q[N],mx,k,mm[N],f[N][N];
struct node{
int x,y;
}t[N];
int dis(node x,node y)
{
return (x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y);
}
void dfs(int x,int y)
{
if(!~vs[x])
{
vs[x]=y;
for(int i=1;i<=n;i++)
if(v[x][i])
dfs(i,y^1);
}
}
int bfs()
{
memset(p,0,sizeof(p));
memset(mm,0,sizeof(mm));
p[q[l=r=1]=0]=1;
while(l<=r)
{
for(int i=0;i<=n+1;i++)
if(!p[i]&&v[q[l]][i])
p[q[++r]=i]=p[q[l]]+1;
++l;
}
return p[n+1];
}
int sou(int x)
{
if(x==n+1)
return 1;
for(int&i=mm[x];i<=n+1;i++)
{
if(v[x][i]&&p[i]==p[x]+1&&sou(i))
{
v[x][i]=0,v[i][x]=1;
return 1;
}
}
return 0;
}
int main()
{
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++)
scanf("%d%d",&t[i].x,&t[i].y);
st[mx=1]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
memset(v,0,sizeof(v));
memset(vs,-1,sizeof(vs));
int k=dis(t[i],t[j]);
c=0;
if(k>d*d)
continue;
for(int a=1;a<=n;a++)
{
if(dis(t[i],t[a])>k||dis(t[j],t[a])>k)
continue;
for(int b=1;b<=n;b++)
if(dis(t[b],t[j])<=k&&dis(t[b],t[i])<=k&&dis(t[a],t[b])>k&&a^b)
v[a][b]=1;
}
for(int a=1;a<=n;a++)
if(dis(t[i],t[a])<=k&&dis(t[j],t[a])<=k&&!~vs[a])
dfs(a,0);
for(int a=1;a<=n;a++)
{
if(vs[a]==0)
v[0][a]=1,++c;
else if(vs[a]==1)
{
for(int b=1;b<=n;b++)
v[a][b]=0;
v[a][n+1]=1,++c;
}
}
memcpy(f,v,sizeof(f));
int g=0,ans=0,tp=0;
while(bfs())
while(g=sou(0))
ans+=g;
if(c-ans>mx)
{
mx=c-ans;
for(int a=1;a<=n;a++)
if(vs[a]==0&&p[a]||vs[a]==1&&!p[a])
st[++tp]=a;
}
}
}
printf("%d\n",mx);
for(int i=1;i<=mx;i++)
printf("%d ",st[i]);
}

[ICPC2014WF]Sensor Network的更多相关文章

  1. 【BZOJ4080】【WF2014】Sensor Network [随机化]

    Sensor Network Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 魔法炮来到了帝都 ...

  2. 【Uvalive4960】 Sensor network (苗条树,进化版)

    [题意] 给出N个点,M条边,问这N个点形成的生成树的最大权值边-最小权值边的最小值 InputThe input consists of several test cases, separated ...

  3. 泛在传感器网络(Ubiquitous Sensor Network; USN)

    http://wiki.mbalib.com/wiki/%E6%B3%9B%E5%9C%A8%E4%BC%A0%E6%84%9F%E5%99%A8%E7%BD%91%E7%BB%9C 什么是泛在传感器 ...

  4. 2016级移动应用开发在线测试13-Location、Sensor & Network

    有趣有内涵的文章第一时间送达! 喝酒I创作I分享 生活中总有些东西值得分享 @醉翁猫咪  1. 充分利用智能手机的GPS定位信息,创造了O2O的商业模式,打通了线上与线下的信息流和商流,极大地推动了移 ...

  5. 【随机化】bzoj4080 [Wf2014]Sensor Network

    #include<cstdio> #include<algorithm> #include<cmath> using namespace std; typedef ...

  6. uvalive 4960 Sensor Network

    题意: 给出一个无向图,求一个生成树使得这个生成树的最大边与最小边之差最小,输出这个最小的差值.n的最大值为350. 思路: 这题不看题解想破头也不知道怎么写Orz. 暴力的做法是可以从大到小枚举边作 ...

  7. 【bzoj4080】[Wf2014]Sensor Network 随机化

    题目描述 魔法炮来到了帝都,除了吃特色菜之外,还准备去尝一尝著名的北京烤鸭.帝都一共有n(1<=1<=100)个烤鸭店,可以看成是二维平面内的点.不过由于魔法炮在吃烤鸭之前没有带钱,所以吃 ...

  8. bzoj 4080: [Wf2014]Sensor Network【瞎搞+随机化】

    参考:https://blog.csdn.net/YihAN_Z/article/details/73380387 一点都不想写正解.jpg random_shuffle一下然后贪心的加点,和ans取 ...

  9. UVALive - 4960 Sensor network(生成树+LCA)

    题目大意:给出N个点.M条边.问这N个点形成的生成树的最大权值边-最小权值边的最小值 解题思路:先排序,然后按生成树的kruscal算法进行加边,再维护一个最小权值边 加边的时候要考虑一下加下去的边是 ...

  10. Contiki Network Stack

    一.协议栈 主要有两大网络协议栈,uIP和Rime这两大协议栈(network stack): The uIP TCP/IP stack, which provides us with IPv4 ne ...

随机推荐

  1. 项目开展CICD的实践探路

    本文介绍了作者对CICD的理解以及在项目中开展CICD的几种场景,总结了每种场景实践的关键节点.带来的收益,以及结合具体项目开展的实际应用.读者可以借鉴本文中描述的场景,或借鉴文中提到的实践方式,在项 ...

  2. 使用pycharm脚本发送钉钉群通知

    使用Pychon脚本发送钉钉群通知 我们可以使用钉钉的机器人助手发送群通知,只需要非常简单的配置就可以实现,而没有任何的成本. 1) 首先我们要在钉钉群里添加一个机器人助手 选择智能群助手,然后选择添 ...

  3. Docker 镜像库国内加速的几种方法

    概述 在国内,拉取 Docker 镜像速度慢/时不时断线/无账号导致限流等,比较痛苦. 这里提供加速/优化的几种方法. 梳理一下,会碰到以下情况: 国内下载速度慢/时不时断线:是因为网络被限制了. 没 ...

  4. Wood,微型 Java ORM 框架(首次发版)

    Wood,微型 Java ORM 框架(支持:java sql,xml sql,annotation sql:事务:缓存:监控:等...),零依赖! 特点和理念: 跨平台:可以嵌入到JVM脚本引擎(j ...

  5. tensorboard可视化点云

    tensorboard可视化点云 用 tensorboard 自带的 add_mesh 方法:支持可视化点云和网格,参考链接: tensorflow 网站的tensorboard pytorch 网站 ...

  6. 开发app软件成本计算参考

    目录 1. 设计成本 2. 前端开发成本 3. 后端开发成本 4. 测试成本 5. 上架试运营成本 app软件开发已成为人们生活中不可或缺的一部分.无论是在娱乐.通讯.信息.健康等方面,都有数不清的a ...

  7. Vue2系列(lqz)——slot插槽 (内容分发)、2 transition过渡、3 生命周期、4 swiper学习、5 自定义组件的封装、6 自定义指令、7 过滤器

    文章目录 1 slot插槽 (内容分发) 1.1 基本使用 1.2 插槽应用场景1 1.3 插槽应用场景2 1.4 具名插槽 2 transition过渡 3 生命周期 4 swiper学习 5 自定 ...

  8. GO数组解密:从基础到高阶全解

    在本文中,我们深入探讨了Go语言中数组的各个方面.从基础概念.常规操作,到高级技巧和特殊操作,我们通过清晰的解释和具体的Go代码示例为读者提供了全面的指南.无论您是初学者还是经验丰富的开发者,这篇文章 ...

  9. Oracle和达梦:连接多行查询结果

    Oracle和达梦:LISTAGG连接查询结果 LISTAGG介绍 使用LISTAGG函数,您可以将多行数据连接成一个字符串,并指定分隔符进行分隔.这在需要将多行数据合并为单个字符串的情况下非常有用, ...

  10. Java 基础学习第一弹

    1. equels和==的区别 equals方法用于比较对象的内容是否相等,可以根据自定义的逻辑来定义相等的条件,而==操作符用于比较对象的引用是否相等,即它们是否指向同一块内存地址.equals方法 ...