题意:给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. Django-C002-深入模型,到底有多深

    此文章完成度[100%]留着以后忘记的回顾.多写多练多思考,我会努力写出有意思的demo,如果知识点有错误.误导,欢迎大家在评论处写下你的感想或者纠错. ORM介绍:对象关系映射(英语:(Object ...

  2. 第1节 flume:11、flume的failover机制实现高可用

    1.4 高可用Flum-NG配置案例failover 在完成单点的Flume NG搭建后,下面我们搭建一个高可用的Flume NG集群,架构图如下所示: 图中,我们可以看出,Flume的存储可以支持多 ...

  3. ios之UIWebView(2)

    UIWebView是iOS sdk中一个最常用的控件.是内置的浏览器控件,我们可以用它来浏览网页.打开文档等等.这篇文章我将使用这个控件,做一个简易的浏览器.如下图: 我们创建一个Window-bas ...

  4. 【数学 exgcd】bzoj1407: [Noi2002]Savage

    exgcd解不定方程时候$abs()$不能乱加 Description Input 第1行为一个整数N(1<=N<=15),即野人的数目. 第2行到第N+1每行为三个整数Ci, Pi, L ...

  5. [POJ] 1135 Domino Effect

    Domino Effect Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12147 Accepted: 3046 Descri ...

  6. python--内置常用模块

    一 . 简单的了解模块 你写的每一个py文件都是一个模块. 还有一些我们一直在使用的模块. buildins  内置模块. print, input. random  主要是和随机相关的的内容 ran ...

  7. 落谷p3376 最大流EdmondsKarp增广路模板

    参考: https://blog.csdn.net/txl199106/article/details/64441994 分析: 该算法是用bfs求出是否有路从s到t, 然后建立反向边(关于反向边), ...

  8. Linux文件管理类命令及命令别名

    文件查看类命令: cat: tac: 从文件尾部开始显示 分屏显示: more [option] 文件名: 查看至文件尾部会退出 空格为翻页 less [option] 文件名: 查看至文件尾部不退出 ...

  9. 【工具】Homebrew的安装及使用

    Homebrew官网:http://brew.sh/index_zh-cn.html Homebrew是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件,相当于linux下的a ...

  10. 【JavaScript 3—基础知识点】:运算符

    导读:其实看到这个运算符的学习,很有一种熟悉感,因为在总体看来,和之前的C++有很多类似的地方,但当时觉得简单,没有总结.所以,这次一定得总结了.其实,知识的罗列,基础的积累,在学习中也很重要. 一. ...