题意:给N个点,还有另外m个点(其中只能选K个),求最短路。

思路:在SPFA的基础上,用一个数组来统计,在某点入队时(要拓展其他点了),若该点是m个点中的,则count【i】=原来的+1;若不是,则继承原来的。出队时候限制一下,若大于K了,就停止拓展。

原题:目前在一个很大的平面房间里有 n 个无线路由器,每个无线路由器都

固定在某个点上。任何两个无线路由器只要距离不超过 r 就能互相建立网

络连接。

除此以外,另有 m 个可以摆放无线路由器的位置。你可以在这些位置

中选择至多 k 个增设新的路由器。

你的目标是使得第 1 个路由器和第 2 个路由器之间的网络连接经过尽

量少的中转路由器。请问在最优方案下中转路由器的最少个数是多少?

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct points
{
int x,y;
};
const int inf=0x3f3f3f3f;
int n,m,k,r;
vector<points>v; //点
int map[205][205]; //图
int dis(points a,points b) //距离
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
void get_gra() //建图
{
for(int i=0;i<n+m;i++)
{
for(int j=i+1;j<n+m;j++)
{
if(dis(v[i],v[j])<=r*r)
{
map[j][i]=map[i][j]=1;
}
else
{
map[i][j]=map[j][i]=inf;
}
}
}
}
int inq[205];
int d[205];
int count[205];
void spfa()
{
queue<int>q;
for(int i=0;i<n+m;i++)
{
count[i]=inq[i]=0;
d[i]=inf;
}
q.push(0);inq[0]=1;d[0]=0;
while(!q.empty())
{
int cur=q.front();
q.pop();inq[cur]=0;
if(count[cur]>k)continue; //限制,某点出队的次数
for(int i=0;i<n+m;i++)
{
if(d[i]>d[cur]+map[cur][i])
{
d[i]=d[cur]+map[cur][i];
if(inq[i]==0)
{
if(i>=n) //被限制次数的点,若是经过该点(该点入队),则加
{
count[i]=count[cur]+1;
}
else //一般的点继承
{
count[i]=count[cur];
}
inq[i]=1;
q.push(i);
}
}
} } }
int main()
{
while(cin>>n>>m>>k>>r)
{
v.clear();
points temp;
for(int i=0;i<n+m;i++)
{
cin>>temp.x>>temp.y;
v.push_back(temp);
}
get_gra();
spfa();
cout<<d[1]-1<<endl; //问的是中间有几个点
}
return 0;
}

最短路中部分点只能从中任意选取K个问题的更多相关文章

  1. 最短路中部分点仅仅能从中随意选取K个问题

    题意:给N个点,还有另外m个点(当中仅仅能选K个).求最短路. 思路:在SPFA的基础上,用一个数组来统计,在某点入队时(要拓展其它点了),若该点是m个点中的,则count[i]=原来的+1:若不是. ...

  2. 求从n个数组任意选取一个元素的所有组合

    最近做项目碰到这个问题,如题从n个数组任意选取一个元素的所有组合.比如已知数组是[1, 3]; [2, 4]; [5]; 最后组合结果是[1, 2, 5]; [1, 4, 5];  [3, 2, 5] ...

  3. hdu6003 Problem Buyer 贪心 给定n个区间,以及m个数,求从n个区间中任意选k个区间,满足m个数都能在k个区间中找到一个包含它的区间,如果一个区间包含了x,那么 该区间不能再去包含另一个数,即k>=m。求最小的k。如果不存在这样的k,输出“IMPOSSIBLE!”。

    /** 题目:hdu6003 Problem Buyer 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6003 题意:给定n个区间,以及m个数,求从n个区 ...

  4. 记录我对'我们有成熟的时间复杂度为O(n)的算法得到数组中任意第k大的数'的误解

    这篇博客记录我对剑指offer第2版"面试题39:数组中出现次数超过一半的数字"题解1的一句话的一个小误解,以及汇总一下涉及partition算法的相关题目. 在剑指offer第2 ...

  5. Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)

    上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...

  6. input属性type为file打开文件资源管理器时,如何限制多次选取或只能一次选取的行为

    1.input标签没有设置multiple属性,文件资源管理器默认一次选取 <!doctype html> <html lang="en"> <hea ...

  7. 面试中常问的有关随机选取k个数的总结

    1.在半径为1的圆中随机选取一点. 2.给定一个未知长度的整数流,如何随机选取一个数 3.给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字).如何才能从这个无穷尽的流 ...

  8. hdu 5137 去掉一个点 使得最短路最大(2014广州现场赛 K题)

    题意:从2~n-1这几个点中任意去掉一个点,使得从1到n的最短路径最大,如果任意去掉一个点1~n无通路输出Inf. Sample Input4 51 2 31 3 71 4 502 3 43 4 23 ...

  9. eduCF#61 C. Painting the Fence /// DP 选取k段能覆盖的格数

    题目大意: 给定n m 接下来给定m个在n范围内的段的左右端 l r 求选取m-2段 最多能覆盖多少格 #include <bits/stdc++.h> using namespace s ...

随机推荐

  1. ucosii(2.89)semaphore 应用要点

    semaphore 的作用:1,允许一个任务与其他任务(中断)同步.2,取得共享资源使用权.3,标志事件的发生.

  2. JavaScript中数据类型和typeof返回的数据类型

    除了上图,要注意三点:1.symbol是ES6中新增的数据类型 2.typeof(null)结果是Object 3.typeof(Object)和typeof(Array)的结果是function,因 ...

  3. fckeditor配置详解

    使用配置设置: . FCKConfig.CustomConfigurationsPath = '' ; // 自定义配置文件路径和名称 . FCKConfigFCKConfig.EditorAreaC ...

  4. non-JRMP server at remote endpoint

    #在相应的domain的domain.xml文件添加下面红色设置,并重启domain <admin-service system-jmx-connector-name="system& ...

  5. 洛谷 P1214 等差数列

    https://www.luogu.org/problemnew/show/P1214 首先暴力枚举可以凑出来的数,对于每个数进行标记. 对于每一个等差数列,当我们知道前两个数后即可以得出整个序列,那 ...

  6. P2261 bzoj1257 [CQOI2007]余数求和

    一道数论分块首先这类的求和写一下公式∑n%i=∑n-i*(n/i)= ∑n-∑i*(n/i) 前面的好求所以 ans=nk+∑k*(k/i);于是进行分块这里总结一下只要出现除法∑就进行分块由阿尔贝和 ...

  7. 对Java提供的锁机制的一些思考

    Java的数据会在CPU.Register.Cache.Heap和Thread stack之间进行复制操作,而前面四个都是在Java Threads之间共享,因此Java的锁机制主要用于解决Racin ...

  8. 概述「并查集补集转化」模型&&luoguP1330 封锁阳光大学

    奇妙的模型转化以及并查集思想 模型概述 有图$G=(V,E)$,初始所有点为白色,现在要将其中一些点染为黑色,要求染色后满足:$∀(u,v)∈E$,$∃col_u!=col_v$.求最小染色点数. 题 ...

  9. Ubuntu apt-get出现unable to locate package解决方案

    前言 刚安装好的ubuntu 17发现apt-get安装指令异常. 故经网上搜索调查发现,发现这个问题基本是因为apt-get需要更新的缘故. 解决方案 只需使用命令升级更新即可. sudo apt- ...

  10. NFS网络共享服务 挂载参数及优化 内核优化建议

    配置NFS服务端 nfs01上安装软件 [root@nfs01 ~]# yum install nfs-utils rpcbind -y nfs-utils:NFS服务的主程序,包括rpc.nfsd. ...