[ICPC2014WF]Sensor Network
题目描述
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的更多相关文章
- 【BZOJ4080】【WF2014】Sensor Network [随机化]
Sensor Network Time Limit: 2 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 魔法炮来到了帝都 ...
- 【Uvalive4960】 Sensor network (苗条树,进化版)
[题意] 给出N个点,M条边,问这N个点形成的生成树的最大权值边-最小权值边的最小值 InputThe input consists of several test cases, separated ...
- 泛在传感器网络(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 什么是泛在传感器 ...
- 2016级移动应用开发在线测试13-Location、Sensor & Network
有趣有内涵的文章第一时间送达! 喝酒I创作I分享 生活中总有些东西值得分享 @醉翁猫咪 1. 充分利用智能手机的GPS定位信息,创造了O2O的商业模式,打通了线上与线下的信息流和商流,极大地推动了移 ...
- 【随机化】bzoj4080 [Wf2014]Sensor Network
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; typedef ...
- uvalive 4960 Sensor Network
题意: 给出一个无向图,求一个生成树使得这个生成树的最大边与最小边之差最小,输出这个最小的差值.n的最大值为350. 思路: 这题不看题解想破头也不知道怎么写Orz. 暴力的做法是可以从大到小枚举边作 ...
- 【bzoj4080】[Wf2014]Sensor Network 随机化
题目描述 魔法炮来到了帝都,除了吃特色菜之外,还准备去尝一尝著名的北京烤鸭.帝都一共有n(1<=1<=100)个烤鸭店,可以看成是二维平面内的点.不过由于魔法炮在吃烤鸭之前没有带钱,所以吃 ...
- bzoj 4080: [Wf2014]Sensor Network【瞎搞+随机化】
参考:https://blog.csdn.net/YihAN_Z/article/details/73380387 一点都不想写正解.jpg random_shuffle一下然后贪心的加点,和ans取 ...
- UVALive - 4960 Sensor network(生成树+LCA)
题目大意:给出N个点.M条边.问这N个点形成的生成树的最大权值边-最小权值边的最小值 解题思路:先排序,然后按生成树的kruscal算法进行加边,再维护一个最小权值边 加边的时候要考虑一下加下去的边是 ...
- Contiki Network Stack
一.协议栈 主要有两大网络协议栈,uIP和Rime这两大协议栈(network stack): The uIP TCP/IP stack, which provides us with IPv4 ne ...
随机推荐
- 【路由器】Breed 介绍、刷入和使用
目录 介绍 文件说明 刷入 Breed 通过 Breed 刷机 其他功能 参考资料 介绍 Breed 是国内个人 hackpascal 开发的闭源 Bootloader,也被称为"不死鸟&q ...
- 机器学习-评价指标-AUCROC
The Area Under the Receiver Operating Characteristic (AUC-ROC) curve is a performance metric commonl ...
- 使用API接口获取商品数据
在当今的数字化时代,商品数据的获取对于各种规模的企业来说都至关重要.这些数据可以帮助企业进行市场分析,制定销售策略,优化库存管理,以及实现精准营销.API(应用程序编程接口)是一种便捷的方式来获取 ...
- C++的编译链接与在vs中build提速
通过gcc或msvc,clang等编译器编译出来的C++源文件是.o文件.在windows上也就是PE文件,linux为ELF文件,在这一步中,调用其它代码文件中的函数的函数地址是未知的(00000) ...
- Graphviz入门
Graphviz可以用于状态机图的绘制 要绘制一张状态图,我们需要两个图形元素 结点,边 结点和边都有自己的属性 结点可以是圆.矩形.填充 边有粗细
- KRpano项目微信出现"关于潜在的违法或违规内容"
最近,部分小伙伴反应某些KRPano项目在微信中,出现"关于潜在的未发或违规内容"而无法播放的问题,会看到下图中的提示: 出现原因 这个问题是由于KRPano项目中的webvr.j ...
- 【火坑】一切从TimeSpan说起
小编在编写WPF程序时,需要做一个判断:定时使用Modbus协议使用Quartz.net 定时任务读取设备中的数据,同时也使用定时任务判断是否长时间获取不到数据的情况,如果程序中超过一分钟没有获取到数 ...
- Linux——Linux必备的基础知识总结
文章目录 一.Linux操作系统概述 1.发展 2.组成 3.Linux的特性: 二.Linux操作系统安装 1.Linux的选择 2.安装Ubuntu Desktop 3.基本操作 三.Linux文 ...
- 手撕Vue-界面驱动数据更新
经过上一篇文章,已经将数据驱动界面改变的过程实现了,本章节将实现界面驱动数据更新的过程. 界面驱动数据更新的过程,主要是通过 v-model 指令实现的, 只有 v-model 指令才能实现界面驱动数 ...
- P1182 数列分段 Section II 题解
Problem 考察知识点:二分.贪心. 题目描述 对于给定的一个数组,现要将其分成 \(M\) 段,并要求每段连续,且每段和的最大值最小. 思路 二分答案出每段和最大值的最小值,然后贪心检验是否满足 ...